CodeIgniter: por qué usar xss_clean

si estoy desinfectando mis insertos DB, y también escapo del HTML escribo con htmlentities($text, ENT_COMPAT, 'UTF-8') – ¿hay algún punto para filtrar también las entradas con xss_clean? ¿Qué otros beneficios ofrece?

xss_clean () es extenso, y también tonto. El 90% de esta función no hace nada para evitar xss. Como buscar la palabra alert pero no document.cookie . Ningún pirata informático va a utilizar la alert en su exploit, van a secuestrar la cookie con xss o leer un token CSRF para hacer un XHR.

Sin embargo, ejecutar htmlentities() o htmlspecialchars() es redundante. Un caso donde xss_clean() soluciona el problema y htmlentities($text, ENT_COMPAT, 'UTF-8') falla es el siguiente:

 "; ?> 

Un simple poc es:

http: //localhost/xss.php? var = http: //domain/some_image.gif ‘% 20onload = alerta (/ xss /)

Esto agregará el controlador onload= event a la etiqueta de imagen. Un método para detener esta forma de xss es htmlspecialchars($var,ENT_QUOTES); o en este caso xss_clean() también evitará esto.

Sin embargo, citando de la documentación xss_clean ():

Nada es 100% infalible, por supuesto, pero no he podido pasar nada por el filtro.

Dicho esto, XSS es un output problem no un input problem . Por ejemplo, esta función no puede tener en cuenta que la variable ya está dentro de una etiqueta o controlador de eventos. Tampoco detiene DOM Based XSS. Debe tener en cuenta cómo está usando los datos para usar la mejor función. Filtrar todos los datos en la entrada es una mala práctica . No solo es inseguro sino que también daña datos que pueden dificultar las comparaciones.

En su caso, “los métodos más estrictos son buenos y más livianos” . Los desarrolladores de CodeIgniter pretenden xss_clean () para un caso de uso diferente, “un sistema de comentarios o foro que permite tags HTML ‘seguras'”. Esto no está claro en la documentación, donde se muestra xss_clean aplicado a un campo de nombre de usuario.

Hay otra razón para nunca usar xss_clean (), que no se haya resaltado en stackoverflow hasta el momento. xss_clean () se rompió durante 2011 y 2012 , y es imposible solucionarlo por completo. Al menos sin un rediseño completo, que no sucedió. Por el momento, sigue siendo vulnerable a cadenas como esta:

 Hello 

La implementación actual de xss_clean () comienza al aplicar efectivamente urldecode () y html_entity_decode () a toda la cadena. Esto es necesario para que pueda usar una verificación ingenua para cosas como “javascript:”. Al final, devuelve la cadena decodificada .

Un atacante simplemente puede codificar su exploit dos veces. Será decodificado una vez por xss_clean (), y pasará como limpio. Luego tiene un exploit codificado individualmente, listo para ser ejecutado en el navegador.

Llamo a estos controles “ingenuos” e irrefutables porque dependen en gran medida de expresiones regulares. HTML no es un lenguaje normal. Necesita un analizador más potente para que coincida con el del navegador ; xss_clean () no tiene nada de eso. Tal vez sea posible incluir en la lista blanca un subconjunto de HTML, que lee limpiamente con expresiones regulares. Sin embargo, el actual xss_clean () es en gran medida una lista negra.

Sí, aún deberías estar usándolo, generalmente establezco una regla para usarlo al menos en la entrada pública , es decir, cualquier entrada a la que cualquiera pueda acceder y enviar.

En general, desinfectar la entrada para las consultas DB parece un efecto secundario, ya que el verdadero propósito de la función es evitar ataques de secuencias de comandos entre sitios .

No voy a entrar en los detalles esenciales de cada paso que toma xss_clean, pero te diré que hace más que los pocos pasos que mencionaste, he empalmado el origen de la función xss_clean para que puedas verte a ti mismo, está completamente comentado.

Recomendaría usar http://htmlpurifier.org/ para hacer la purificación de XSS. Estoy trabajando para extender mi clase de entrada CodeIgniter para comenzar a aprovecharla.

Si desea que el filtro se ejecute automáticamente cada vez que encuentre datos POST o COOKIE, puede habilitarlo abriendo su archivo application / config / config.php y estableciendo esto: $ config [‘global_xss_filtering’] = TRUE;

Puede habilitar la protección csrf abriendo su archivo application / config / config.php y estableciendo esto: $ config [‘csrf_protection’] = TRUE;

para más detalles, mira en el siguiente enlace.

https://ellislab.com/codeigniter/user-guide/libraries/security.html