Для тех, кто является опытным пользователем интернета, наверное, уже приходилось слышать об XSS уязвимостях на сайте, к чему это может привести. Если же нет, то давайте попробуем немного внести ясность в этот вопрос. XSS — одна из разновидностей атак на сайт, а если быть точным на пользователей сайта. XSS-уязвимость может быть использована по разному, от мелкого хулиганства, до доступа к аккаунту другого пользователя. Последствия при этом уже зависят от ситуации.
Так что же такое XSS?
XSS – межсайтовый скриптинг, посредством которого можно исполнять код на стороне клиента, а это значит иметь возможность получить cookies пользователей, публиковать от их лица сообщения, ну или что либо ещё, что вбредет в голову. Суть в том, что через уязвимое место на сайте внедряется некий код, который подгружается у других пользователей в браузере. При этом злоумышленник может элементарно выдернуть cookies из браузера, и отправить их на свой сервер-накопитель, после чего вы рискуете потерять свой аккаунт. XSS — штука довольно гибкая, и может быть использована по всякому, на форме, где вводятся какие-либо данные, в случае если злоумышленнику удалось внедрить зловредный код, эти данные могут быть скомпрометированы. А теперь задумайтесь, какие это могут быть данные. Полагаю, у вас в общих чертах появилось представление о том, что это вообще, теперь давайте рассмотрим, что можно предпринять.
Что же можно предпринять?
Если вы владелец сайта, то естественно есть желание что-либо предпринять, и это хорошее желание. Попасть вредоносный код на сайт может по-всякому. В большинстве случаем это поля ввода данных на форме, которые отправляются на сервер, после чего показываются другим пользователям. Найти поля ввода на сайте думаю, вам не составит труда. После этого, попробуйте ввести следующие строки, указанные ниже.
<script>alert("cookie: "+document.cookie)</script> "><script>alert("cookie: "+document.cookie)</script> '><''>"><script>alert("cookie: "+document.cookie)</script>
Отправьте форму, и если есть уязвимость в том месте, где показываются данные, появится окно что-то вроде этого:
Особенность XSS в том, что атака производится не на базу данных, а на клиентскую часть. Таким образом, сама база данных может оказаться хранителем вредоносного кода. Обнаружить вредоносный код в базе куда сложнее, т.к. рубеж этапа проверки данных с полей формы уже пройден, и по-хорошему их нужно проверять перед записью в базу.
Фильтрация XSS
Чтобы обезопасить данные от XSS инъекции, целесообразно экранировать все спец. символы, которые могут быть использованы для внедрения кода. Если вы используете PHP, то там есть специальные функции, которые весьма неплохо справляются с этой задачей. Одна из них это htmlspecialchars(), она более предпочтительна.
Вторая – strip_tags(), но её использовать не рекомендуется, т.к. есть способы оформления кода, которые позволят внедрить код даже через функцию, вот пример:
<body onload=alert('xss')> <img src=javascript:alert('xss')> <body background="javascript:alert('xss')" > <meta http-equiv="refresh" content="0;url=javascript:alert('xss');"> <style type="text/javascript">alert('xss');</style>
Так же, если вы используете в качестве веб-сервера Apache, то в файле .htaccess вы можете прописать следующие правила:
Options +FollowSymLinks RewriteEngine On RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) RewriteRule ^(.*)$ index.php [F,L]
На самом деле наличие XSS уязвимости — проблема более серьезная, чем кажется, и получила развитие в этом направлении, с более ухищренными методами атаки. В связи с этим, построение атаки, основанные на XSS можно разделить активные и пассивные XSS атаки. Активные – те, что внедряются в код страницы атакуемого сайта, пассивные – это может быть ссылка, по которой нужно кликнуть, или вставить ссылку в адресную строку браузера, далее дело техники. При этом, ссылка может быть закодирована, и не всегда понятна человеческому глазу.