В самом деле, просто позвольте серверу вывести его так, чтобы входная строка эффективно встраивалась в исходный HTML-код, который возвращался клиенту.
Пример 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:
<!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>
В качестве альтернативы вы можете снова отобразить значение в элементах ввода, что также часто встречается:
<input type="text" name="xss" value="<?= $_GET['xss'] ?>">
соответственно.
<input type="text" name="xss" value="${param.xss}">
Таким образом, «странные» строки атаки, такие как "/><script>alert('xss')</script><br class="
, будут работать, потому что сервер все равно будет отображать их как
<input type="text" name="xss" value=""/><script>alert('xss')</script><br class="">
Решения для предотвращения XSS среди прочих htmlspecialchars()
и fn:escapeXml()
для PHP и JSP соответственно. Они заменят <
, >
и "
на <
, >
и "
, так что ввод от конечного пользователя не будет буквально встроен в источник HTML, а вместо этого будет отображаться как это было введено.