2008-10-13 10 views
17

Estoy buscando las mejores prácticas para realizar la validación/filtro estricto (lista blanca) del HTML enviado por el usuario.Validación estricta de HTML y filtrado en PHP

El propósito principal es filtrar XSS y nasties similares que se pueden ingresar a través de formularios web. El propósito secundario es limitar la rotura de contenido HTML ingresado por usuarios no técnicos, p. a través del editor WYSIWYG que tiene una vista HTML.

Estoy considerando usar HTML Purifier, o hacer rodar el mío usando un analizador HTML DOM para pasar por un proceso como HTML (sucio) -> DOM (sucio) -> filtro-> DOM (limpio) -> HTML (limpiar).

¿Puede describir los éxitos con estas o cualquier otra estrategia más fácil que también sea efectiva? ¿Alguna trampa que hay que tener en cuenta?

Respuesta

9

He probado todos los exploits que conozco en HTML Purifier y lo hizo muy bien. Filtra no solo HTML, sino también CSS y URL.

Una vez que los elementos estrechos y atributos a los inocentes, las trampas se encuentran en contenido de los atributos - javascript: pseudo-URL (es decir, permite que los caracteres de tabulación en nombre del protocolo - java	script: todavía funciona) y propiedades CSS que desencadenan JS.

El análisis de URL puede ser complicado, p. estos son válidos: http://spoof.com:[email protected] o //evil.com. Los dominios internacionalizados (IDN) se pueden escribir de dos maneras: Unicode y punycode.

Vaya con HTML Purifier: tiene la mayoría de estas cosas resueltas. Si solo quiere arreglar HTML roto, entonces use HTML Tidy (está disponible como extensión PHP).

+2

... pista: http://htmlpurifier.org/ – BlaM

+0

¡Gracias por su respuesta! –

+2

Resulta que estaba lejos de ser seguro en 2008, estos exploits se encontraron en 2011: http://secunia.com/advisories/43907/, 2010: http://secunia.com/advisories/39613/ Lección: Asegúrese de siempre actualice su instalación de filtro. – Cheekysoft

5

El HTML enviado por el usuario no siempre es válido o, de hecho, está completo. Los navegadores interpretarán una amplia gama de HTML no válido y debes asegurarte de que puedas atraparlo.

también ser consciente de la validez de aspecto:

<img src="http://www.mysite.com/logout" /> 

y

<a href="javascript:alert('xss hole');">click</a> 
+0

Gracias Ross, estos son excelentes ejemplos de los tipos de entrada que deben filtrarse. Pero la respuesta que estoy buscando incluirá métodos y soluciones también. –

+0

El primer ejemplo (que es una referencia a un artículo de codinghorror: http://www.codinghorror.com/blog/archives/001171.html) no es realmente relevante ya que el 'agujero' depende de la naturaleza de esa URL, más bien que la sintaxis de este fragmento de HTML en particular. –

+0

Todavía hay reglas útiles que podrían aplicarse al primero, por ejemplo, "permitir la etiqueta solo cuando el atributo src coincide con la expresión regular /^http:\/\/localsite.com\/uploaded_images\/[\w-] * \. (png | jpg | gif) $/i ". –

-1

El W3C tiene un paquete de código abierto grande para la validación de HTML disponible aquí:

http://validator.w3.org/

Puede descargar el paquete usted mismo y probablemente implementar lo que sea que estén haciendo Desafortunadamente, parece que muchos analizadores de DOM parecen estar dispuestos a ceder las reglas para asignar código HTML "en la naturaleza" por así decirlo, por lo que es una buena idea dejar que los maestros te digan lo que está mal y no dejarlo. una herramienta más práctica: hay muchos sitios web que no son HTML perfecto y compatible, pero que seguimos usando todos los días.

+3

La validación contra DTD no protege contra XSS en absoluto. – Kornel

+0

Exactamente, no creo que eso sea lo que Barry quiso decir con validación: piense en la validación o evaluación de datos en lugar de la validación de estándares. Esto ayudaría contra HTML mal formado;) – Ross

1

Utilicé el purificador de HTML con éxito y no he recibido ningún xss u otro filtro de entrada no deseado. También ejecuto el HTML desinfectar a través de la extensión Tidy para asegurarme de que también lo valida.