De hecho, solo deje que el servidor lo emita para que la cadena de entrada se incruste efectivamente en el código fuente HTML que se devuelve al cliente.
ejemplo PHP:
<!doctype html>
<html lang="en">
<head><title>XSS test</title></head>
<body>
<form><input type="text" name="xss"><input type="submit"></form>
<p>Result: <?= $_GET['xss'] ?></p>
</body>
</html>
ejemplo JSP:
<!doctype html>
<html lang="en">
<head><title>XSS test</title></head>
<body>
<form><input type="text" name="xss"><input type="submit"></form>
<p>Result: ${param.xss}</p>
</body>
</html>
alternativa, se puede volver a mostrar el valor de los elementos de entrada, que también es a menudo visto:
<input type="text" name="xss" value="<?= $_GET['xss'] ?>">
resp.
<input type="text" name="xss" value="${param.xss}">
esta manera las cadenas de ataque "extraños" como "/><script>alert('xss')</script><br class="
funcionarán porque el servidor hará que después de todo lo
<input type="text" name="xss" value=""/><script>alert('xss')</script><br class="">
soluciones XSS de prevención son entre otros htmlspecialchars()
y fn:escapeXml()
para PHP y JSP, respectivamente. Esos reemplazarán entre otros <
, >
y "
por <
, >
y "
de modo que la entrada del usuario final no quede literalmente incrustada en el código HTML, sino que se visualice tal como fue ingresada.
¿Está utilizando algún idioma del lado del servidor? – StingyJack
.NET (pero no ASP.NET) – vtortola