Estoy tratando de desinfectar y XSS prueba alguna entrada HTML del cliente. Estoy usando Python 2.6 con Beautiful Soup. Analizo la entrada, elimino todas las etiquetas y atributos que no están en una lista blanca y transformo el árbol en una cadena.¿Cómo hacer que Beautiful Soup produzca entidades HTML?
Sin embargo ...
>>> unicode(BeautifulSoup('text < text'))
u'text < text'
Eso no se ve como HTML válido para mí. Y con mi separador de etiquetas, que abre el camino a toda clase de maldad: serán eliminados
>>> print BeautifulSoup('<<script></script>script>alert("xss")<<script></script>script>').prettify()
<
<script>
</script>
script>alert("xss")<
<script>
</script>
script>
Los <script></script>
pares, y lo que queda es no sólo un ataque XSS, pero aun así HTML válido.
La solución obvia es reemplazar todos los caracteres <
por <
que, después del análisis, se encuentran para no pertenecer a una etiqueta (y similar para >&'"
). Pero el Beautiful Soup documentation solo menciona el análisis de entidades, no la producción de ellas. Por supuesto, puedo ejecutar un reemplazo sobre todos los nodos NavigableString
, pero como podría extrañar algo, preferiría que algún código probado y comprobado hiciera el trabajo.
¿Por qué Beautiful Soup escape <
(y otros caracteres mágicos) de forma predeterminada, y cómo lo hago?
N.B. También miré lxml.html.clean
. Parece que funciona sobre la base de listas negras, no listas blancas, por lo que no parece muy seguro para mí. Las etiquetas pueden incluirse en la lista blanca, pero los atributos no pueden, y permite demasiados atributos para mi gusto (por ejemplo, tabindex
). Además, da un AssertionError
en la entrada <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
. No está bien.
Sugerencias para otras formas de limpiar HTML también son bienvenidas. No soy la única persona en el mundo que intenta hacer esto, pero parece que no hay una solución estándar.
'text
Gumbo
Oh, correcto. De todos modos, hace lo mismo con 'text 'que mostré. –
Thomas