XSS-уязвимость – это уязвимость на сервере, которая позволяет внедрить в генерируемую и затем передаваемую пользователю страницу формата HTML некий произвольный код, порой весьма вредоносный. Причем подчеркну – код внедряется не в сам скрипт, а именно в страницы, передаваемые пользователям. Так что сервер как таковой опасности не подвергается, подвергаются ей только посетители сайта.
Для того чтобы защититься от XSS атак и устранить все возможные XSS уязвимости вашего сайта, достаточно перед работой с входными данными пропустить их через фильтр и заменить все опасные спец символы безопасными:
1
2
$filter = array("<", ">");
$_GET['q']=str_replace ($filter, "|", $_GET['q']);
Этих двух маленьких строчек кода достаточно для избежание больших проблем. Теперь если попытаться внедрить инъекцию через адресную строку или форму ввода
http://yourdomain.ru/searh?q=”><script>alert(“cookie: “+document.cookie)</script>
Никаких сообщений мы больше не увидим, поскольку все скобки в переменной $_GET['q'] будут заменены на безопасные символы “|”, и JS код станет невыполнимым.
В этом примере показан способ защиты только одной переменной, на практике необходимо будет пропускать через подобный фильтр все входные параметры на всех страницах с XSS уязвимостями.
Для массовой проверки входящих данных, методами POST и GET можно использовать такую функцию:
1
2
3
4
5
6
7
8
9
function defender_xss($arr){
$filter = array("<", ">");
foreach($arr as $num=>$xss){
$arr[$num]=str_replace ($filter, "|", $xss);
}
return $arr;
}
//используйте функцию перед обработкой входящих данных:
$_REQUEST=defender_xss($_REQUEST);
Кроме того будет не лишним дополнить фильтр другими символами для фильтрации:
1
$filter = array("<", ">","="," (",")",";","/");
Альтернативным способом защиты будет использование штатных PHP функций:
strip_tags() – удаляет из строки все HTML-теги, кроме разрешённых.
htmlspecialchars() – заменяет все спецсимволы на их HTML-аналоги.
Будьте аккуратны, strip_tags() можно обойти, используя инъекции подобного рода:
1
2
3
4
5
<body>
<body>
<meta>
<style>alert('xss');</style>