Depende del contexto en el que se produzca la inyección.
Obviamente, si la inyección se produce en el contexto de un contenido de elementos como este:
<p>Your search for "❌" has returned the following results:</p>
<
es necesario para cambiar de texto a marcado. Pero incluso aquí, si hace eco de la entrada del usuario en un <script>
, por ejemplo:
<script>var search = "❌";</script>
Necesitará buscar otros caracteres ya que no está en el contexto de texto sin formato. Aquí debe cuidar los caracteres que son especiales dentro de los literales de cadenas de JavaScript, así como ciertas secuencias que pueden denotar el script
etiqueta final del elemento , por ejemplo, </script>
o </script/
.
Del mismo modo, si imprime una entrada de usuario en el valor de atributo de un elemento:
<input type="text" name="search" value="❌">
Aquí debe ocuparse de los caracteres que son especiales para los valores de atributo entre comillas dobles , es decir, la delimitación "
quote. Si está utilizando comillas simples o ninguna, se deben aplicar reglas diferentes.
Además, no solo tiene que buscar la sintaxis sino también la semántica. Al igual que hay javascript:
y data:
URI que se pueden usar para XSS. O hay un JavaScript que utiliza parte de los datos provistos por el usuario para alguna evaluación, o recuperación de algún código de script adicional, etc. Hay cientos de ejemplos .
Entonces siempre tenga en cuenta el contexto en el que desea colocar los datos proporcionados por el usuario y codificar esos datos de manera correspondiente.