2010-05-05 7 views
6

Estoy codificando un ancho de editor WYSIWYG designMode = "on" en un iframe. El editor funciona bien y almaceno el código como está en la base de datos.Mejor práctica: limpieza HTML generado por el usuario

Antes de enviar el html, tengo que "limpiarlo" con php en el servidor para evitar secuencias de comandos entre sitios y otras cosas aterradoras. ¿Hay algún tipo de práctica recomendada sobre cómo hacer esto? ¿Qué etiquetas pueden ser peligrosas?

ACTUALIZACIÓN: Typo arreglado, es lo que ves es lo que obtienes. Nada nuevo :)

+0

Si está decidido a implementarlo usted mismo, será mejor que eche un vistazo a http://ha.ckers.org/xss.html, una lista de ataques conocidos en varios navegadores. – FalseVinylShrub

+0

Una gran pregunta - Me he preguntado cómo se protege stackoverflow ... – JDelage

Respuesta

5

La mejor práctica es permitir solo ciertas cosas que usted sabe que no son peligrosas, y eliminar/escapar del resto. Vea el documento Automated Malicious Code Detection and Removal on the Web (OWASP AntiSamy) para una discusión sobre esto (la biblioteca es para Java, pero los principios se aplican a cualquier idioma).

+0

Empecé de esa manera, pero como todos los navegadores implementan esto de manera diferente, obtendré muchas etiquetas para lo mismo que debo permitir. Por ejemplo, el texto en negrita se hace en al menos 3 formas diferentes. Por lo tanto, será un gran conjunto de expresiones regulares. También es posible pegar el html con formato que desee en el editor, como un html-mail o algo así. Y eso se ve bien en el editor, pero no funcionará después de escapar. – Martin

+1

Es por eso que AntiSamy ya viene con algunos conjuntos de ejemplos. Probablemente, también hay una biblioteca PHP (¿o puede crear una?) * Nunca * la alcanzará al revés (al incluir en la lista negra): todos los que probaron esto antes, han fallado, simplemente no es posible de manera realista, allí * lo harán * sea ​​algo que no haya cubierto (lo cual es fatal para la inclusión en la lista negra, pero no importa demasiado cuando se incluye en la lista blanca). Idealmente, si puede evitar HTML, use Markdown, etc., como lo sugiere Hank. –

+1

@Martin usted * REALMENTE * no debería usar expresiones regulares para esto. Hay una razón [esta respuesta] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) obtuvo (neto) 3000 upvotes. –

0

Si está familiarizado con ASP .NET, simplemente realizar una Server.HTMLEncode() para convertir caracteres especiales como <> a "& g t;" "& l t;"

En php, puede usar funciones htmlspecialchars().

Una vez que los caracteres especiales están codificados, se pueden evitar los scripts entre sitios.

+0

Pero eso deshabilita html, quiero permitir html pero eliminar etiquetas peligrosas como iframe y script. – Martin

+0

Luego use un marcado específicamente diseñado para el prupose como bbcode o wikicode y un editor adecuado. – symcbean

3

Si realmente está dispuesto a permitir esto, debe utilizar un enfoque de lista blanca.

El mejor enfoque es probablemente no permitir HTML y usar un formato de marcado simplificado; puede renderizar previamente en HTML y almacenarlo en la base de datos si el rendimiento es una preocupación. Evitar este tipo de problemas es una de las grandes razones para el uso de Markdown, Textile, reStructuredText, etc.

NOTA: he vinculado a GitHub con sabor de rebajas (GFM), no estándar de rebajas (SM). GFM aborda algunos problemas comunes que los usuarios finales tienen con SM.

1

He examinado la misma pregunta recientemente con Perl como el lenguaje del lado del servidor.

Mientras lo hacía me encontré con HTML Purifier que puede ser lo que quieres. Pero obviamente como está en PHP y no en Perl, en realidad no lo probé.

Además, en mi investigación llegué a la conclusión de que este es un asunto muy complicado y lo considero posible si utilizo un lenguaje de marcado simplificado como Markdown, tal como lo sugirió Hank Gay.

Cuestiones relacionadas