Preciso anche io, che mi ero informato perché pensavo che Symon83 avesse trovato dei problemi nell'usarle, o peggio ancora che non gli funzionassero a dovere!
@*pragma
Le funzioni sono relativamente semplici.
La prima serve per validare il testo, e opportunamente modificate per contare di quanti caratteri è composto.
Sfrutta semplicemente una espressione regolare per controllare che ci siano solo alcuni caratteri e non altri (come le parentesi angolari, per esempio).
Al posto di mettersi a fare il decode degli elementi HTML, li blocco e restituisco un messaggio di errore!
La funzione è come segue:
Codice PHP:
function validaTesto($str){
return (bool) preg_match("^[[:alnum:]\.\,\;\:\!\?\-\_\(\)\[\]\'\"\»\«]+$^", $str);
}
La seconda funzione invece, che uso dopo la validazione del testo, sostituisce tutti i caratteri speciali (lettere accentate, caratteri particolari come l'ampersand eccetera) in caratteri XHTML friendly.
In questo modo, si evitano problemi di compatibilità tra il charset di MySQL e quello della pagina HTML, in più si va a fare l'escape su tutti i caratteri tipo il % e gli apici, per evitare ulteriori problemi.
Codice PHP:
function filtraTesto($str){
$str = stripslashes($str);
$caratteri = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
$str = strtr($str, $caratteri);
$str = mysql_real_escape_string($str);
return $str;
}
Se vuoi imporre un limite minimo e massimo ai caratteri presenti nel testo da filtrare (tipo per un controllo di validità sulle password), puoi modificare la funzione come segue:
Codice PHP:
function validaTesto($str, $min, $max){
return (bool) preg_match("^[[:alnum:]\.\,\;\:\!\?\-\_\(\)\[\]\'\"\»\«]{$min, $max}+$^", $str);
}
function filtraTesto($str){
$str = stripslashes($str);
$caratteri = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
$str = strtr($str, $caratteri);
$str = mysql_real_escape_string($str);
return $str;
}
if (!validaTesto($testo_da_controllare, 10, 20)) {
echo "Spiacente, hai inserito dei caratteri non voluti, oppure la stringa non è di minimo 10 caratteri e massimo 20";
exit;
}
// poi filtro per il DB
$testo_da_controllare = filtraTesto($testo_da_controllare);
Ed il gioco è fatto.
Ultimo consiglio: se siete un minimo esperti di attacchi hacking, vi consiglio di fare tutta una serie di test per capire se in qualche modo, queste funzioni presentano falle.