Aquí hay un ejemplo tonto que hace trampas haciendo un uso indebido de htmlspecialchars
de la forma que pretendía.
<?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"
?>
Envíe cualquier carga útil XSS y agregue un byte UTF-8 no válido, p.
http://site/silly.php?x=<script>alert(0)</script>%fe
htmlspecialchars
fianzas en una secuencia de bytes UTF-8 no válida y devuelve una cadena vacía. Imprimir el valor $_GET
es un agujero obvio, pero tengo algo que decir.
En resumen, obtendrá verificaciones byte a byte con Latin1 y UTF-8, por lo que no conozco un ejemplo dependiente del idioma donde htmlspecialchars
perderá un byte peligroso en una codificación, pero no otro.
El punto de mi ejemplo es que su pregunta fue más general (y tal vez un poco demasiado vaga) a los peligros de XSS al cambiar los esquemas de codificación. Cuando el contenido comienza a tratar con diferentes codificaciones de múltiples bytes, los desarrolladores pueden ensuciar los filtros de validación basados en strchr()
, strlen()
, o cheques similares que no son conscientes de múltiples bytes y pueden ser frustrados por un% 00 en la carga útil. (Oye, algunos desarrolladores aún mantienen el uso de expresiones regulares para analizar y desinfectar HTML.)
En principio, creo que las dos líneas de ejemplo en la pregunta tienen la misma seguridad en cuanto a cambiar la codificación. En la práctica, todavía hay muchas formas de cometer otros errores con codificación ambigua.
Esta es una muy buena respuesta. Gracias. – rook