2009-03-31 13 views
11

he desarrollado una aplicación web, que permite a mis usuarios para gestionar algunos aspectos de un sitio web de forma dinámica (sí, algún tipo de CMS) en el entorno de la lámpara (Debian, Apache, PHP, MySQL)¿Cómo puedo permitir que mi usuario inserte código HTML, sin riesgos? (no sólo los riesgos técnicos)

Bueno, por ejemplo, crean noticias en su área privada en mi servidor, luego esto se publica en su sitio web a través de una solicitud de cURL (o por ajax).

La noticia se crea con un editor WYSIWYG (fck en este momento, probablemente tinyMCE en el futuro).

Por lo tanto, no puedo rechazar las etiquetas html, pero ¿cómo puedo estar seguro? ¿Qué tipo de etiquetas DEBO eliminar (javascripts?)? Eso en el sentido de ser seguro para el servidor ... pero ¿cómo ser 'legalmente' seguro? Si un usuario usa mi aplicación para hacer xss, ¿puedo tener algunos problemas legales?

Respuesta

15

Si está utilizando php, una solución excelente es usar HTMLPurifier.Tiene muchas opciones para filtrar cosas malas y, como efecto secundario, garantiza una salida html bien formada. Lo uso para ver spam que puede ser un ambiente hostil.

+0

Decidí tomar este camino, más algún tipo de pasos personales. Debo dar la total libertad a mis clientes para usar etiquetas html ('cos del editor WYSIWYG), restringiendo solo ciertas cosas. Espero que mantenerlas actualizadas con las últimas puertas de seguridad no sean muy problemáticas. – Strae

+1

Confío mucho más en que confío en mis propios esfuerzos ... – DGM

2

En lugar de permitir HTML, debe tener alguna otra marca que se pueda convertir a HTML. Tratando de despojar a cabo HTML pícaro de entrada del usuario es casi imposible, por ejemplo

<scr<script>ipt etc="..."> 

Extracción de este dejará

<script etc="..."> 
+0

U cantar una lista blanca en lugar de una lista negra resolvería este problema. – Gumbo

+0

vea la respuesta de la etiqueta img en http://stackoverflow.com/questions/701580/how-can-i-allow-my-user-to-insert-html-code-without-risks-not-only-technical-r/701609 # 701609 – cjk

+0

XSS también es posible a través de otros lenguajes de marcado, como BBcode, por lo que realmente no arregla nada. Un enfoque de lista blanca funciona bastante bien. – troelskn

6

La mejor estrategia general es la lista blanca etiquetas y atributos específicos que considere segura , y escapar/eliminar todo lo demás. Por ejemplo, una lista blanca sensible podría ser <p>, <ul>, <ol>, <li>, <strong>, <em>, <pre>, <code>, <blockquote>, <cite>. Como alternativa, considere marcado humana de usar como Textile o Markdown que se pueden convertir fácilmente en HTML seguro.

+0

¿Aún no puede insertar scripts en las etiquetas permitidas usando una lista blanca? – jeroen

+0

Eso depende de cómo los está escapando. Si está describiendo algo como " ipt ...", primero notaría que "" y también se escapó/eliminó. –

+0

Estaba pensando más en los atributos, pero supongo que eso depende de si su lista blanca tiene alguna etiqueta que los necesite, por lo que tendría que permitirlos. Si permites los atributos, tendrás que deshacerte de todo el rango de onclick = "", etc., pero supongo que es bastante obvio :) – jeroen

11

Realmente no importa lo que está buscando eliminar, alguien siempre encontrará la manera de evitarlo. Como referencia, eche un vistazo a este XSS Cheat Sheet.

A modo de ejemplo, cómo nunca vas a quitar este ataque XSS válida:

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

Su mejor opción sólo se permite un subconjunto de etiquetas aceptables y retire cualquier otra cosa. Esta práctica se conoce como White Listing y es el mejor método para prevenir XSS (además de no permitir HTML).

También use la hoja de trucos en su prueba; dispara todo lo que puedas en tu sitio web e intenta encontrar formas de realizar XSS.

+0

+1 para la hoja de referencia –

0

Si es muy difícil eliminar las etiquetas, puede rechazar todos los datos html hasta que el usuario ingrese uno válido. Rechazaría html si contiene las siguientes etiquetas:

frameset, frame, iframe, script, object, embed, applet.

También las etiquetas que desea anular son: encabezado (y subetiquetas), cuerpo, html porque desea proporcionarlas usted mismo y no desea que el usuario manipule sus metadatos.

Pero en términos generales, permitir que el usuario proporcione su propio código html siempre impone algunos problemas de seguridad.

0

Es posible que desee considerar, en lugar de permitir HTML en absoluto, la implementación de algunos standin para HTML como BBCode o Markdown.

1

Kohana's security helper es bastante bueno. Por lo que recuerdo, fue tomado de un proyecto diferente.

Sin embargo he probado a cabo

<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29> 

De LFSR Consulting's answer, y escapé correctamente.

-1

code that I should have just copy/pasted instead of screenshotting

Está muy buena función en php que puede usarlo

$string = strip_tags($_POST['comment'], "<b>"); 
+0

Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (https://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (https://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la crítica] (/ review/low-quality-posts/18479859) – codechurn

0

utilizo esta función strip_tags php porque quiero usuario puede publicar de forma segura y que permita que acaba de algunas etiquetas que se pueden utilizar en el post de esta manera nadie puede hackear su sitio web a través de inyección de scripts así que creo que es la mejor opción strip_tags

Clich here for code for this php function

Cuestiones relacionadas