Pregunta

Necesito implementar un sencillo y eficaz filtro XSS en C ++ para CppCMS . No puedo utilizar los filtros de alta calidad existente escrito en PHP, porque ya que es el marco de alto rendimiento que utiliza C ++.

La idea básica es proporcionar un filtro que tiene una lista, mientras que las etiquetas HTML y un blanco lista de opciones para estas etiquetas. Por ejemplo. entrada HTML típico puede constar de <b>, <i>, etiquetas y etiquetas <a> con href. Pero no es fácil aplicación lo suficientemente bueno, porque, enlaces simples, incluso permitidos pueden incluir XSS:

<a href="javascript:alert('XSS')">Click On Me</a>

Hay muchos otros ejemplos se pueden encontrar no . Por lo tanto, aunque también se trata de una posibilidad de crear una lista blanca de prefijos de etiquetas como href / src - por lo que siempre hay que comprobar si se comienza con (https?|ftp)://

Preguntas:

  • ¿Son estas suposiciones son lo suficientemente bueno para la mayoría de propósitos? Lo que significa que si no lo hago dar una opciones para las etiquetas y comprobar style src / href utilizando la lista blanca de prefijos que resuelve los problemas de XSS? ¿Hay problemas que no pueden ser arreglos de esta manera?
  • ¿Hay una buena referencia para la gramática formal de HTML / XHTML con el fin de escribir sencilla analizador que haría la limpieza de todo incorrecta de etiquetas prohibidas como <script>
¿Fue útil?

Solución

Puede tomar un vistazo al proyecto anti Samy, tratando de lograr lo mismo. Es Java y .NET sin embargo.

Editar 1, un poco más:

Puede potencialmente llegar a una muy estricta lista blanca. Debe estructurarse bien y debe ser muy apretado y no mucho más flexible. Cuando se combina la flexibilidad, por lo que muchas etiquetas, atributos y diferentes navegadores generalmente se termina con una vulnerabilidad XSS.

No sé lo que es sus requisitos, pero me gustaría ir con un soporte estricta y simple etiqueta (sólo b li h1 etc.) y la compatibilidad de atributos a continuación estricta basada en la etiqueta (por ejemplo src sólo es válida en href etiqueta), entonces usted necesita para hacer listas blancas en los valores de atributos como ha afirmado http | https | ftp o style = "color | background-color", etc.

.

Considere la siguiente:

<x style="express/**/ion:(alert(/bah!/))">

También es necesario pensar acerca de algunas listas blancas o algún carácter UTF-8 normalización, ya que diferentes codificaciones pueden causar problemas de difícil solución. Tales como nuevas líneas en los atributos, válidos secuencias no UTF-8.

Otros consejos

Todos los detalles del análisis de HTML son especifican en HTML 5 . Sin embargo la aplicación de la misma es un buen montón de trabajo, y no importa si va a analizar HTML exactamente con todos los casos de esquina. En el peor, que terminará con diferentes DOM, pero hay que desinfectar DOM de todos modos.

Como se ha mencionado, existen varias implementaciones de PHP de esto, pero no sé de ninguna en C ++, ya que eso no es un lenguaje típicamente aplicada al desarrollo web. En general, va a depender de la complejidad de una aplicación que desea llegar a.

Una lista blanca muy restrictiva es probablemente la forma "simple", pero si quieres ser realmente integral que se ocuparía de hacer una conversión de una de las versiones establecidas a C ++, en lugar de tratar de escribir su propia desde cero. Hay tantos trucos que preocuparse, que creo que sería mejor de pie sobre los hombros de otros que ya han pasado por todo eso.

No sé nada acerca del uso de C ++ para el desarrollo web, pero la conversión de PHP para que no parece como que sería una tarea particularmente difícil, PHP no tiene realmente ninguna de las capacidades mágicas que C ++ no podrá duplicar. Estoy seguro de que habrá algunos pequeños tirones, pero en general si quieres ir a la ruta más compleja que sería definitivamente todavía ser más rápido para hacer una conversión de un diseño completo desde cero.

Purificador HTML parece una fuerte aplicación PHP que aún se mantiene activa, hay un documento de comparación donde el autor discute algunas diferencias entre su enfoque y la de otros, probablemente vale la pena leer.

Lo que viene para arriba con, sin duda probarlo con todos los ejemplos con los que enlace, y asegurarse de que sea todos aquellos. Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top