No creo que sea una buena idea dar instrucciones sobre los ataques XSS; Aunque existen muchos recursos, por ejemplo. Cap. 12 de la WAHH en XSS.
La mejor manera de prevenir ataques XSS es sustituir cada carácter especial utilizado en estos ataques (por ejemplo, <
, >
, &
, "
, '
con su carácter html equivalente <
, >
, &
, "
, '
) para todo el texto proporcionado por el usuario y solo permite a los usuarios marcar sus comentarios utilizando un lenguaje de marcado no html limitado (como markdown) que solo se sustituye en una caja fuerte subconjunto de html en el último paso del procesamiento. (También tenga cuidado de que sus comentarios nunca se ejecuten en ningún tipo de procesamiento javascript que haya escrito).
Si elige ignorar esto y solo se desinfectan etiquetas específicas (como <script>
, <object>
, javascript
, compruebe que el saneamiento se realiza de forma recursiva (por lo que <scr<script>ipt>
no se convierte en <script>
después de una -el saneamiento de paso), es insensible a mayúsculas y minúsculas, y solo se detiene cuando el último intento de saneamiento completo no cambió la entrada. En python algo como
import re
def sanitation_single_pass(user_input):
pattern = re.compile('<[^>]*(script|object|meta|style)[^>]*>', re.IGNORECASE)
# this is very quick sample regex that could appear in a sanitation routine
# not meant to be inclusive of most XSS threats;
# e.g. this doesn't prevent having javascript in links or img src, etc.
return pattern.sub('', user_input)
def sanitation(user_input):
processed_user_input = sanitation_single_pass(user_input)
while processed_user_input != user_input:
user_input = processed_user_input
processed_user_input = sanitation_single_pass(user_input)
return processed_user_input
También preste atención a los problemas de codificación, asegúrese de definir un conjunto de caracteres ( <meta charset="utf-8">
en la parte superior de sus plantillas html) y de forzar la entrada del usuario en esta codificación antes del saneamiento. También trate de reconocer que algunos navegadores interpretarán cosas como java
script
como javascript
( 

es un salto de línea), etc.