Ecco un esempio sciocco che imbroglia usando in modo errato htmlspecialchars
come desiderato.
<?php
$s = htmlspecialchars($_GET['x'], ENT_QUOTES);
$s_utf8 = htmlspecialchars($_GET['x'], ENT_QUOTES, 'UTF-8');
if(!empty($s))
print "default: " . $_GET['x'] . "<br>\n";
if(!empty($s_utf8))
print "utf8: " . $_GET['x'] . "<br>\n"
?>
Inviare qualsiasi payload XSS e aggiungere un byte UTF-8 non valido, ad es.
http://site/silly.php?x=<script>alert(0)</script>%fe
htmlspecialchars
balle su un valido UTF-8 sequenza di byte e restituisce una stringa vuota. La stampa del valore $_GET
è un buco evidente, ma ho un punto da fare.
In breve, si ottengono controlli byte per byte con Latin1 e UTF-8, quindi non sono a conoscenza di un esempio dipendente dalla lingua in cui htmlspecialchars
mancherà un byte pericoloso in una codifica, ma non un altro.
Il punto del mio esempio è che la tua domanda era più generale (e forse un po 'troppo vaga) dei pericoli dell'XSS quando si cambia schema di codifica. Quando il contenuto inizia a trattare con codifiche multibyte diverse, gli sviluppatori possono oscurare i filtri di convalida basati su strchr()
, strlen()
o controlli simili che non sono a conoscenza di più byte e potrebbero essere contrastati da una% 00 nel payload. (Ehi, alcuni sviluppatori continuano a utilizzare le espressioni regolari per analizzare e disinfettare l'HTML.)
In linea di principio, penso che le due righe di esempio nella domanda abbiano uguale sicurezza per quanto riguarda la commutazione della codifica. In pratica, ci sono ancora molti modi per fare altri errori con una codifica ambigua.
Questa è un'ottima risposta. Grazie. – rook