En primer lugar, la "codificación UTCI-16 ASCII" es una contradicción, ya que UTF-16 y ASCII son esquemas de codificación mutuamente excluyentes. Pero presumiblemente se está refiriendo al uso de Unicode para omitir los mecanismos de filtrado.
El principio general es este: a menudo pensamos en caracteres codificados en ASCII: "A" es el número 65, "z" es el número 122. Pero ese no es el único esquema de codificación de caracteres; Debido a que el mundo usa más que solo el alfabeto inglés, necesitamos representar muchos más caracteres que eso. Por lo tanto, Unicode, que tiene representaciones para casi todos los personajes en todos los idiomas escritos, desde el cingalés hasta el klingon.
Representar a todos esos caracteres (aproximadamente 1.1 millones posibles, no todos en uso) en forma numérica es un verdadero desafío. Podría usar 32 bits, pero eso es un desperdicio de espacio ya que 3 de los 4 bytes suelen ser cero. Podría usar una longitud variable, pero luego no puede realizar operaciones de subcadenas de tiempo constante. Por lo tanto, existen varios estándares, uno de los cuales es UTF-16 (que probablemente haya adivinado utiliza caracteres de 16 bits).
No todos los programadores están acostumbrados a la idea de tratar con conjuntos de caracteres múltiples, aunque el marco subyacente a menudo los respalde. Por lo tanto, a veces se establecerán reglas o precauciones de filtrado asumiendo que los caracteres se representarán en UTF-8 o ASCII, que generalmente son.
Entonces, el filtro busca una cadena dada, como \"
por ejemplo, que en ASCII y UTF-8 corresponde al patrón {92,34}. Pero en UTF-16 se ve diferente; en realidad es {0,92,0,34}, que es lo suficientemente diferente como para deslizarse por un filtro que no lo esperaba.
Y aunque el filtro no comprende UTF-16, el marco subyacente sí lo hace, por lo que el contenido se normaliza e interpreta de la misma manera que cualquier otra cosa, lo que permite que la consulta continúe sin filtrar.
EDITAR PARA AGREGAR:
Tenga en cuenta que PHP es excepcionalmente pobre en el manejo de codificaciones de caracteres; y en todo caso, eso es subestimar el problema. PHP, por defecto, trata a todas las cadenas como ASCII, lo que significa que las funciones internas como strstr
y preg_replace
simplemente asumen que todas las cadenas están codificadas en ASCII. Si eso suena peligrosamente inadecuado, es porque lo es. Pero en su defensa, recuerde que PHP es anterior a UTF-16 en aproximadamente un año, y todo esto supuestamente se soluciona en la versión 6 de PHP.
Mientras tanto, la biblioteca mbstring se creó para abordar esta deficiencia, pero no se implementa ni se despliega ampliamente. Si tienes la suerte de tener esta extensión a tu disposición, puedes utilizar mbstring.overload en su archivo php.ini para forzar a las funciones internas de procesamiento de cadenas a ser reemplazadas por alternativas multibyte-aware. Esto también se puede activar usando la directiva php_admin_value
en sus archivos .htaccess
.
Otra función útil es mb_internal_encoding , que establece la codificación utilizada internamente por PHP para representar cadenas. Al utilizar una codificación interna compatible con Unicode, puede aliviar algo de maldad. Al menos una referencia que leí (pero lamentablemente no puedo encontrar ahora) sugiere que al establecer la codificación interna en UTF-8, habilita el procesamiento adicional en las cadenas de entrada que las normalizan a una sola codificación. Por otro lado, al menos otra referencia sugiere que PHP se comporta de la manera más estúpida posible en este sentido, y simplemente absorbe los datos sin modificar independientemente de su codificación, y le permite lidiar con las consecuencias. Mientras que el primero tiene más sentido, con lo que sé sobre PHP, creo que lo segundo es igual de probable.
Como alternativa final; y menciono esto solo en parte en broma, es simplemente no usar PHP y en su lugar adoptar una arquitectura mejor diseñada. Es difícil encontrar un marco tan popular que tenga tantos problemas fundamentales como PHP. El lenguaje, la implementación, el equipo de desarrollo, la arquitectura de complementos, el modelo de seguridad, es realmente una pena que PHP esté tan ampliamente implementado como lo está. Pero esto es, por supuesto, solo una opinión.