Supponendo che questo sta per essere messo in contenuto HTML (come ad esempio tra <body>
e </body>
o tra <div>
e </div>
), è necessario codificare i 5 caratteri XML speciali (&, <, >," '), e OWASP raccomanda di includere barra (/) e il comando incorporato PHP, htmlentities()
farà la prima parte per voi, e un semplice str_replace()
può fare la barra:.
function makeHTMLSafe($string) {
$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
$string = str_replace('/', '/', $string);
return $string;
}
Se, tuttavia, inserirai il valore contaminato in un attributo HTML, come la clausola href=
di un <a
, dovrai codificare un diverso set di caratteri ([spazio]% * + , - /; < =>^e |) -e è necessario fare doppio citazione attributi vostro HTML:
function makeHTMLAttributeSafe($string) {
$scaryCharacters = array(32, 37, 42, 43, 44, 45, 47, 59, 60, 61, 62, 94, 124);
$translationTable = array();
foreach ($scaryCharacters as $num) {
$hex = str_pad(dechex($num), 2, '0', STR_PAD_LEFT);
$translationTable[chr($num)] = '&#x' . $hex . ';';
}
$string = strtr($string, $translationTable);
return $string;
}
La preoccupazione finale è illegale caratteri UTF-8, quando consegnato alcuni browser, un UTF-8 sequenza di byte mal formati può uscire da un'entità HTML. Per proteggersi da questo, è sufficiente assicurarsi che tutti i caratteri UTF-8 che si ottengono sono validi:
function assertValidUTF8($string) {
if (strlen($string) AND !preg_match('/^.{1}/us', $string)) {
die;
}
return $string;
}
La u
modificatore su quella espressione regolare lo rende un Unicode corrispondenza regex. Accoppiando un singolo chararchter, .
, siamo certi che l'intera stringa è Unicode valida.
Poiché questo è tutto dipendente dal contesto, è meglio eseguire una qualsiasi codifica all'ultimo momento possibile, appena prima di presentare l'output all'utente. Essere in questa pratica facilita anche la visione di tutti i posti che hai perso.
OWASP fornisce una grande quantità di informazioni sul loro XSS prevention cheat sheet.
Assicurarsi di utilizzare istruzioni preparate per evitare l'iniezione SQL. http://php.net/manual/en/pdo.prepared-statements.php –