Ниже приведен упрощенный пример страницы, которую пользователь создал на сайте (они создали ее, заполнив форму, а затем получили URL-адрес для страницы; ниже приведен HTML-код для страницы, которую он создал).
В этом примере я беру значение скрытого поля ввода и затем помещаю его в DOM как есть.Это приводит к предупреждению, имитирующему XSS-атаку.
Каков наилучший способ предотвратить подобные вещи?Значение #sourceinput ранее было введено тем же или другим пользователем, который просматривал страницу ниже, и пользовательский ввод не был отфильтрован для удаления тегов.(Фактический случай включает в себя плагин jquery.tooltip.js и его обратный вызов bodyHandler; при наведении мыши обратный вызов bodyHandler получает скрытый ввод и отображает его пользователю.)
Один из способов справиться с этим -раздеть теги на входе;Я контролирую то, что происходит в скрытом текстовом поле, чтобы это, казалось, решало его.
Другим способом было бы убрать теги в Javascript, но некоторые из них не кажутся эффективными на 100%:
Убрать HTML из текста JavaScript
Есть ли какая-то лучшая практика, которую я пропускаю, или это два лучших способа?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title></title>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script>google.load("jquery", "1.7.1");</script>
<script>
$(document).ready(function() {
var badHTML = $('#sourceinput').val();
$('#destinationdiv').html( badHTML );
//$('#destinationdiv').text( badHTML );
});
</script>
</head>
<body>
<input type="hidden" id="sourceinput" value="<script>alert('hi');</script>" />
<div id="destinationdiv" style="width:10px;height:10px;background-color:red;"></div>
</body>
</html>
ОБНОВЛЕНИЕРешение, с которым я сейчас работаю, состоит из трех частей:
Когда созданная пользователем страница сохраняется, я запускаю PHP strip_tags () для их ввода.Это всего лишь короткие текстовые строки, такие как заголовки и пометки, поэтому мало кто будет ожидать, что они смогут вводить HTML.Это может не подходить для других ситуаций.
Когда отображается страница, созданная пользователем, вместо помещения того, что пользователь ввел в атрибут входного значения, я помещаю их ввод вdiv.
Я извлекаю значение из этого div, используя .text () (не .html ()).Затем я запускаю это через функцию подчеркивания (см. Ниже).
Проверка этого - в том числе имитация пропуска первого шага - кажется, работает.По крайней мере, я надеюсь, что ничего не пропустил.