PHP: strip_tags, eliminare tag HTML da un testo con eccezioni

Tutti noi sappiamo che per eliminare i tag HTML da una stringa (ad esempio da un form inviato da un utente) possiamo utilizzare la comoda funzione nativa di PHP strip_tags().

Se abbiamo ad esempio una stringa inviata da un utente malintezionato, che vuole inserire del codice HTML (un link ad un sito ad esempio…) possiamo fare così:

$commento = strip_tags($_POST['commento']);

E se volessimo invece abilitare all’utente la possibilità di mettere un testo in grassetto?

Possiamo fare così:

$commento = strip_tags($_POST['commento'],'<strong>');

Nel caso volessimo abilitare più di un tag possiamo utilizzare questa sintassi:

$commento = strip_tags($_POST['commento'],'<strong>,<a>');

In questo modo l’utente avrà la possibilità di mettere link e grassetti.

Attenzione: strip_tags() elimina tutti i tag HTML, ma anche i tags PHP !

Per approfondimenti: http://it2.php.net/manual/it/function.strip-tags.php

Approfondisci

PHP: Apici o Doppi apici? Questo è il problema.

Cosa è meglio usare quando stampiamo delle stringhe in PHP? Gli apici o i doppi apici?

A livello di risultato non cambia assolutamente nulla, ma è importante sapere che i doppi apici rendono il nostro codice più pesante per il server. Questo significa che la pagina ci metterà di più ad essere renderizzata.

Si tratta ovviamente di differenze veramente piccole, ma se consideriamo un progetto di una ventina di pagine .php capiamo che è comunque importante soffermarci per ottimizzare il nostro codice.

Partiamo da una cosa importante: PHP non riconosce le variabili all’interno di una stringa delimitata da due apici. Ciò significa che questa riga di codice:

$nome = 'Massimiliano';
echo 'Ciao mi chiamo $nome !';

Stamperà a video questo: Ciao mi chiamo !

Questo accade perchè PHP si aspetta solo testo all’interno dei due apici e ignora qualsiasi variabile all’interno.

Ci sono due soluzioni a questo:

1. Usare i doppi apici

$nome = 'Massimiliano';
echo "Ciao mi chiamo $nome !";

2. Scorporare le variabili

$nome = 'Massimiliano';
echo 'Ciao mi chiamo '.$nome.' !';

Entrambe le soluzioni sono corrette ma quale usare?

In linea generale abbiamo detto che gli apici sono “più leggeri” per cui io opto per la soluzione numero 2, che produce, a parer mio, un codice anche più pulito.

Vedere con il nostro editor una variabile scorporata dal testo, rende il codice più leggibile e comprensibile.

L’ultima cosa è ricordarsi (per la regola della leggerezza) di utilizzare questa sintassi:

$nome = $_POST['nome'];

e non questa (doppi apici = più pesante):

$nome = $_POST["nome"];

Approfondisci

Sicurezza in PHP – SQL injections

Cos’è un SQL injection ?

Direttamente da html.it

la SQL injection consiste nell’inserimento di query T-SQL e nella modifica di interrogazioni già esistenti nelle pagine dinamiche, così da far compiere all’applicazione un’azione del tutto imprevista.

Un altra buona definizione direttamente da wikipedia

La SQL injection è una tecnica dell’hacking mirata a colpire le applicazioni web che si appoggiano su un database di tipo SQL. Questo exploit sfrutta l’inefficienza dei controlli sui dati ricevuti in input ed inserisce codice maligno all’interno di una query SQL. Le conseguenze prodotte sono imprevedibili per il programmatore: l’Sql Injection permette al malintezionato di autenticarsi con ampi privilegi in aree protette del sito (ovviamente, anche senza essere in possesso delle credenziali d’accesso) e di visualizzare e/o alterare dati sensibili.

Soluzioni

– Non fidarsi dell’input dell’utente. Mai. Anche un utente che commette un errore , e non un malintenzionato, può provocare danni.

– Eseguire sempre l’escape dei caratteri utilizzando mysql_real_escape_string() oppure addslashes()

– Controllare la direttiva di PHP magic_quotes_gpc. Se impostata su ON non eseguire l’escape in quanto viene fatto automaticamente e procurerebbe solo un escape multiplo.

– Se stiamo ricevendo un email da un form , controlliamo che sia valida (esistono molte funzioni in giro).

– Stiamo ricevendo un dato e ci aspettiamo che sia un numero? Eseguiamo il casting (int)$_POST[‘input_utente’]

Approfondisci