Effettivamente, lascia che sia il server ad emetterlo in modo che la stringa di input venga effettivamente incorporata nell'origine HTML che viene restituita al client.
esempio 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>
JSP esempio:
<!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>
In alternativa è possibile visualizzare nuovamente il valore negli elementi di input, che è anche spesso visto:
<input type="text" name="xss" value="<?= $_GET['xss'] ?>">
resp.
<input type="text" name="xss" value="${param.xss}">
questo modo "strano" stringhe di attacco come "/><script>alert('xss')</script><br class="
funzioneranno perché il server renderà dopo tutto come
<input type="text" name="xss" value=""/><script>alert('xss')</script><br class="">
soluzioni XSS di prevenzione sono tra gli altri htmlspecialchars()
e fn:escapeXml()
rispettivamente per PHP e JSP. Quelli sostituiranno tra gli altri <
, >
e "
entro il <
, >
e "
in modo che l'input dell'utente finale non finisca per essere letteralmente incorporato nella sorgente HTML, ma invece viene visualizzato appena inserito.
Si sta utilizzando un linguaggio lato server? – StingyJack
.NET (ma non ASP.NET) – vtortola