Xss атака форм защиты на php. Хранимые XSS-атаки и защита от них (удаляем javascript из html в браузере)

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

Дело в том, что в большинстве литературных источников про это говорится либо очень мало, либо ни слова. Откуда начинающий пользователь узнает о потенциальном враге, если его держать в неведении? Именно поэтому я постараюсь уделять внимание вопросам безопасности при написании скриптов. И начну я, пожалуй, с самой известной атаки - XSS.

Думаю большинство из Вас знает, что такое XSS-атака, она же Cross-Site Scripting attack, а также многие из Вас знают как от них защищаться. Эта уязвимость основана на том, что хакер внедряет в страницу сайта какой-то свой код (HTML, JavaScript, а иногда даже и PHP). Это может привести к различного рода неприятностям. Например:

    Допустим на страницу была внедрена простая безобидная ссылка. Ссылка ведёт на сайт злоумышленника, и представляет собой точную внешнюю копию того сайта, на котором была размещена. Человек, попав на сайт злоумышленника, может нечаянным образом оставить свои логин и пароль. Создание точной копии сайта жертвы на сервере злоумышленника - очень эффективный способ взлома и распространён широко в интернете и он далеко не обязательно связан с XSS-атакой. Сейчас особенно много ссылок на поддельный сайт Вконтакте, имеющие адреса типа vkantagte.ru.

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

    Помимо взлома и кражи сайта, всегда возможна порча содержимого и дефейс страницы, т.е. изменение внешнего вида.

Атаки XSS бывают активными и пассивными.

Пассивный XSS

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

Активный XSS

Подразумевается, что скрипт хранится на сервере и срабатывает в браузере при открытии страницы с заражённым объектом. Этот тип XSS также называют вторым типом. Этому типу подвержены сайты стандарта Веб 2.0, т.е. форумы, блоги, соц.сети и так далее.

От XSS уязвимости вас могут защитить две основные функции:

  • strip_tags() - удаляет из строки все HTML-теги, кроме разрешённых.
  • htmlspecialchars() - заменяет все спецсимволы на их HTML-аналоги (< заменяется на < и т.д.)

В принципе, если проверять переданные пользователем переменные (будь то форма или простой запрос через адресную строку), то этих функций обычно хватает. Однако я бы посоветовал ещё проверять на наличие двоеточия (:), процента (%), слэшей (/ и \), а не только те, что в htmlspecialchars - &, ", ", . Это уже делается функциями с регулярными выражениями - обычно preg_replace.

Некоторые проггеры запрещают только несколько тегов, типа и . Но это неправильно, нужно запрещать практически все теги. Всё для безопасности. Не стоит ждать, когда Ваш сайт взломают.

Профессионалы советуют использовать на сайте несколько уровней жёсткости проверки переданных данных, к примеру:

Уровень 1. Самый жёсткий. Запретить всё, кроме букв и знаков препинания - точка и запятая. Если появится запрещённый символ, то прекращать работу сценария - die().

Уровень 2. Уже не такой жёсткий, можно разрешить несколько основных и безопасных тегов, типа и . И то стоит использовать их заменители [b], [i], а заменять их на теги программно. В случае ввода запрещённого символа - сообщение об ошибке и прерывание работы сценария.

Уровень 3. Аналогично второму, но в случае ошибки - информацию об ошибке не выводить, а проводить замену на аналоги. Уровень для форумов с предусмотрением того, что можно будет оставлять код программ.

Уровень 4. Всё разрешено. Но всё равно проверять на совсем гадкое стоит. Использовать режим не рекомендуется, разве что может для совсем своих проектов или на локальной машине.

Пожалуй на сегодня всё. Жду Ваших комментариев и замечаний, так как наверняка есть ещё идеи на тему.

Начиная с этой недели я опять возвращаюсь к публикациям два раза в неделю и надеюсь буду держать так ещё долго, постараюсь писать ещё чаще, если получится. А пока до новых встреч!

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

Большинство уязвимостей связано с неправильной обработкой данных, получаемых извне, или недостаточно строгой их проверкой. Одной из таких уязвимостей является межсайтовое выполнение сценариев (Сross Site Sсriрting, XSS), которая может привести к дефейсу сайта, перенаправлению пользователя на зараженный ресурс, вставке в веб-ресурс вредоносного кода, краже COOKIE-файлов, сессии и прочей информации. Противостоять XSS своими сила поможет применение лучших практик и рекомендаций по безопасному программированию, о которых и пойдет речь ниже.

1. Используйте экранирование входных\выходных данных. Применяйте встроенные функции для очистки кода от вредоносных скриптов. К ним относятся такие функции как htmlspecialchar(), htmlentities() и strip_tags().
Примеры использования:

$name = strip_tags($_POST["name"]); $name = htmlentities($_POST["name"], ENT_QUOTES, "UTF-8"); $name = htmlspecialchars($_POST["name"], ENT_QUOTES);
Встроенные функции PHP, в отличие от самописных, работают гораздо быстрее, а также имеют меньше ошибок безопасности и уязвимостей, т.к. постоянно совершенствуются. Также рекомендуется использовать специальные библиотеки, построенные на основе встроенных функций и фильтров. В качестве примера можно привести OWASP Enterprise Security API (ESAPI), HTML Purifier, Reform, ModSecurity.
Для того чтобы библиотека работала правильно, её нужно предварительно настроить!

2. Используйте подход «белые списки». Подход работает по принципу «что не разрешено, то запрещено». Это стандартный механизм валидации полей для проверки всех входных данных, включая заголовки, куки, строки запросов, скрытые поля, а также длина полей форм, их тип, синтаксис, допустимые символы и другие правила, прежде чем принять данные, которые будут сохраненные и отображены на сайте. Например, если в поле нужно указать фамилию, необходимо разрешить только буквы, дефис и пробелы. Если отклонить все остальное, то фамилия д’Арк будет отклонена - лучше отклонить достоверную информацию, чем принять вредоносные данные.
К сожалению, со своей задачей встроенные фильтры валидации данных PHP не справляются, поэтому рекомендуется писать собственные фильтры и «допиливать» их по мере необходимости. Таким образом, со временем ваши входные методы фильтрации будут усовершенствованы. Стоит также не забывать, что существует слишком много типов активного содержимого и способов кодирования для обхода подобных фильтров. По этой же причине не используйте проверку по «черному списку».

3. Указывайте кодировку на каждой веб-странице. Для каждой веб-страницы необходимо указывать кодировку (например, ISO-8859-1 или UTF-8) до каких-либо пользовательских полей.
Пример использования:

Сharset
или в файле.htaccess веб-сервера Apache дописать строчку:

AddDefaultCharset UTF-8

Если в http-заголовке или в метатегах кодировка не указана, браузер пытается сам определить кодировку страницы. Стандарт HTML 5 не рекомендует использовать такие кодировки, которые включают JIS_C6226-1983, JIS_X0212-1990, HZ-GB-2312, JOHAB (Windows code page 1361), а также кодировки, основанные на ISO-2022 и EBCDIC. Кроме того, веб-разработчики не должны использовать CESU-8, UTF-7, BOCU-1 и кодировки SCSU. Эти кодировки никогда не предназначались для веб-контента. В случае если тег расположен до тега и заполняется пользовательскими данными, злоумышленник может вставить вредоносный html-код в кодировке UTF-7, обойдя, таким образом, фильтрацию таких символов, как ‘