Термин межсайтовый скриптинг (cross'site scripting), или XSS, относится к об_ ласти компьютерной уязвимости, когда атакующий внедряет HTML_теги или сце_
284 Глава 13. JavaScript в веб*броузерах
нарии в документы на уязвимом веб_сайте. Организация защиты от XSS_атак – обычное дело для веб_разработчиков, занимающихся созданием серверных сце_ нариев. Однако программисты, разрабатывающие клиентские JavaScript_сцена_ рии, также должны знать о XSS_атаках и предпринимать меры защиты от них.
Веб_страница считается уязвимой для XSS_атак, если она динамически создает содержимое документа на основе пользовательских данных, не прошедших предварительную обработку по удалению встроенного HTML_кода. В качестве тривиального примера рассмотрим следующую веб_страницу, которая использу_ ет JavaScript_сценарий, чтобы приветствовать пользователя по имени:
<script>
var name = decodeURIComponent(window.location.search.substring(6)) || ""; document.write("Привет " + name);
</script>
Во второй строке сценария вызывается метод window.location.search.substring, с помощью которого извлекается часть адресной строки, начинающаяся с симво_ ла ?. Затем с помощью метода document.write() добавляется динамически сгенери_ рованное содержимое документа. Этот сценарий предполагает, что обращение к веб_странице будет производиться с помощью примерно такого URL_адреса:
http://www.example.com/greet.html?name=Давид
В этом случае будет выведен текст «Привет Давид». Но что произойдет, если страница будет запрошена с использованием следующего URL_адреса:
С таким содержимым URL_адреса сценарий динамически сгенерирует другой сценарий (коды %3C и %3E – это угловые скобки)! В данном случае вставленный сценарий просто отобразит диалоговое окно, которое не представляет никакой опасности. Но представьте себе такой случай:
Межсайтовый скриптинг потому так и называется, что в атаке участвует более одного сайта. Сайт B (или даже сайт C) включает специально сконструирован_ ную ссылку (подобную только что показанной) на сайт A, в которой содержится сценарий с сайта B. Сценарий evil.js размещается на сайте злоумышленника B, но теперь этот сценарий оказывается внедренным в сайт A и может делать все, что ему заблагорассудится с содержимым сайта A. Он может стереть страницу или вызвать другие нарушения в работе сайта (например, отказать в обслужива_ нии, о чем рассказывается в следующем разделе). Это может отрицательно ска_ заться на посетителях сайта A. Гораздо опаснее, что такой злонамеренный сце_ нарий может прочитать содержимое cookies, хранящихся на сайте A (возможно содержащих учетные номера или другие персональные сведения), и отправить эти данные обратно на сайт B. Внедренный сценарий может даже отслеживать нажатия клавиш и отправлять эти данные на сайт B.
Универсальный способ предотвращения XSS_атак заключается в удалении HTML_ тегов из всех данных сомнительного происхождения, прежде чем использовать их для динамического создания содержимого документа. Чтобы исправить эту про_ блему в показанном ранее файле greet.html, нужно добавить следующую строку в сценарий, которая призвана удалять угловые скобки, окружающие тег <script>:
13.9. Другие реализации JavaScript во Всемирной паутине
name = name.replace(/</g, "<").replace(/>/g, ">");
Межсайтовый скриптинг представляет собой уязвимость, глубоко уходящую корнями в архитектуру Всемирной паутины. Необходимо осознавать всю глуби_ ну этой уязвимости, но дальнейшее ее обсуждение далеко выходит за рамки те_ мы данной книги. В Интернете есть немало ресурсов, которые помогут вам орга_ низовать защиту от атак подобного рода. Наиболее важный из них принадлежит группе компьютерной «скорой помощи» CERT Advisory: http://www.cert.org/ad' visories/CA'2000'02.html.