Hier ist ein dummes Beispiel, das betrügt, indem es htmlspecialchars
von, wie Sie beabsichtigten, mißbraucht.
<?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"
?>
Senden Sie alle XSS-Nutzdaten und fügen Sie ein ungültiges UTF-8-Byte, z.
http://site/silly.php?x=<script>alert(0)</script>%fe
htmlspecialchars
kautionen auf einer ungültigen UTF-8-Byte-Sequenz und einen leeren String zurück. Drucken der $_GET
Wert ist ein offensichtliches Loch, aber ich habe einen Punkt zu machen.
Kurz gesagt, werden Sie Byte-für-Byte-Prüfungen mit Latin1 und UTF-8 bekommen, so dass mir ein sprachabhängiges Beispiel nicht bekannt ist, bei dem htmlspecialchars
ein gefährliches Byte in einer Codierung auslässt, aber nicht Ein weiterer.
Der Punkt meines Beispiels ist, dass Ihre Frage allgemeiner war (und vielleicht ein bisschen zu vage) zu den Gefahren von XSS, wenn Kodierungsschemas geändert werden. Wenn der Inhalt mit der unterschiedlichen Multi-Byte-Codierung beginnt, können Entwickler Validierungsfilter auf Basis von strchr()
, strlen()
oder ähnlichen Überprüfungen, die nicht Multi-Byte-fähig sind und durch eine% 00 in der Nutzlast vereitelt werden, verfälschen. (Hey, einige Entwickler halten sich immer noch daran, Regexes zu verwenden, um HTML zu parsen und zu bereinigen.)
Im Prinzip denke ich, dass die beiden Beispielzeilen in der Frage die gleiche Sicherheit haben wie Schaltcodierung. In der Praxis gibt es noch viele Möglichkeiten, andere Fehler mit mehrdeutiger Codierung zu machen.
Das ist eine sehr gute Antwort. Vielen Dank. – rook