|
|
|||||||||||||||||||||||||||||
|
Безопасное программирование на PHPИсточник: softtime Семенов А.Н., Симдянов И.В.
Безопасность web-приложений имеет большое значение и занимает одно из первых мест в построение надежного и качественного сайта. Рано или поздно сайт подвергнется атаке, пренебрежение безопасностью при написании Web-приложений приведёт к тому, что в лучшем случае вы увидите на главной станице сайта надпись "взломан", а в худшем потеряете важную информацию. В этой статье мы поделимся с вами теми приемами, которыми используем при построении сайтов. Будут рассмотрены методы защиты, позволяющие предотвратить или, по крайней мере, снизит подверженность приложения к XSS-атакам и SQL-инъекциям. Межсайтовый скрипинг (Cross Site Scripting - XSS) позволяет злоумышленнику включать свой HTML код в вашу станицу. Наиболее уязвимы для такого вида атак являются гостевые книги и форумы, где происходит динамическое формирование страниц. Возможности кода, который злоумышленник может вставить в код сайта практически не ограничены, например, вставка тега <img> со ссылкой на скрипт, который расположен на подконтрольном сайте позволяет собирать различную информации (например, cookie). Суть атаки - выйти за пределы HTML тега, через специальные символы, и далее внедрять свой код. Выход из тега чаще происходит с использованием следующих символов - ' (одинарная кавычка), " (двойная кавычка), ´ (обратная кавычка), > (знак "больше"). Защита от этого вида атак сводится к фильтрованию данных отосланных пользователем. ЗамечаниеПодробнее с XSS-атаками можно познакомиться по сслыкам: Рассмотрим код уязвимой станицы
Злоумышленнику достаточно сформировать URL следующего вида:
и страница будет уже содержать следующий код:
Данный код не причиняет вреда, а лишь демонстрирует уязвимость XSS, отображая ваши cookie. Следует помнить, что код может быть другим, более опасным и, будучи оставленным, например, в сообщении гостевой книги будет запускаться на машине каждого из посетителей гостевой книги. ЗамечаниеС синтаксисом регулярных выражений и функциями PHP, предназначенными для работы с Perl-совместимыми регулярными выражениями можно ознакомиться в соответствующем разделе справочника PHP http://www.softtime.ru/group/id_group=3 ЗамечаниеСинтаксис регулярных выражений является достаточно сложным и его изучение требует серьёзных усилий. Наилучшим руководством по регулярным выражением на сегодняшний день является книга Дж. Фридла "Регулярные выражения", позволяющая, по словам автора, "научиться мыслить регулярными выражениями". Чтобы обезопасить себя от такого вида атак, следует отфильтровать значение, передаваемое через параметр username, например, при помощи регулярных выражений:
Можно заострить внимание посетителя на том, что введённые им данные содержат недопустимые символы, за счёт вывода в окно браузера "предупреждения".
Что предпринять - выбор за вами. Лучше написать о разрешенных символах где-нибудь рядом с соответствующим полем HTML-формы, иначе посетитель может вести свое имя и обнаружить что оно отображается не совсем так, как он ожидал (например Elvi$ как Elvi) и ему придется проходить процедуру регистрации повторно. Кроме того, посетитель может случайно вести неверный символ и устрашающий вид страницы plz_die.php, может его отпугнуть. ЗамечаниеСледует проверять ВСЕ переменные получаемые от пользователя - GET, POST, COOKIE. Во все из них без труда можно встроить зловредный код. Особое внимание следует уделять паролям, так как в них не принято вводить ограничения на символы. PHP обладает несколькими функциями, позволяющими значительно облегчить задачу защиты Web-приложений. Одной из таких функций является htmlspecialchars() которая гарантирует, что любой введенный пользователем код (php, javascript и т.д.) будет отображен, но выполняться не будет. Функция имеет следующий синтаксис: SQL-инъекции - абсолютно другой вид атаки и он наиболее опасен. В Web-приложения, где есть данного вида уязвимость, злоумышленник может внедрить свой SQL код, что может провести к потери информации, краже или полному уничтожению базы данных. ЗамечаниеПодробнее об SQL-инъекциях можно почитать по ссылкам Пусть имеется база данных пользователей users, содержащая три поля: первичный ключ (id_user), имя пользователя (name) и его пароль (pass). SQL-оператор CREATE, создающий данную таблицу приведён ниже.
Авторизация пользователей производится через HTML-форму.
Обработчик handler.php проверяет соответствие введённого имени паролю
Данный метод авторизации обходиться указанием следующего значения для пароля pass:
Или даже еще проще, например вводом следующего значения в качестве имени name:
Все что следует за "/*" считается комментарием. В любом из этих случаев будет получен допуск в защищенную область сайта. Как вы уже, наверное, успели заметить, атака основывается через указание кавычки, позволяющей выйти за рамки, отведенных программистом.
Может быть использован любой из них или их комбинации. В некоторых случаях для в формирования SQL используется не строчка, а цифра. Это наиболее опасно, потому что злоумышленнику даже не надо добавлять кавычку, а сразу добавлять код после пробела.
Параметр $id злоумышленника тогда будет иметь такой вид: Проблема числовых параметров, встала еще более остро, начиная с MYSQL 4, где появился SQL-оператор UNION, который позволяет объединить результаты нескольких запросов. Пусть страницу с информацией о пользователе формирует скрипт user.php, который принимает в качестве параметра первичный ключ id_user из таблицы users.
Результатом работы скрипта при обращении к странице по адресу users.php?id_user=1 является вывод имени посетителя: user1 Теперь помещая в адресную строку следующий адрес
можно получить пароль пользователя с первичным ключом id_user = 1: pass1. Поэтому необходимо подвергать пароли в базе данных необратимому шифрованию, например при помощи встроенных функций MySQL: MD5 и PASSWORD. Проверить содержимое числового параметра можно при помощи следующего регулярного выражения:
Или при помощи функции is_numeric()
Третий вид атаки, который может быть произведён на сайт - это флуд, часто в автоматической форме. ЗамечаниеРазмещение однотипных сообщений на форуме или гостевой книге на жаргоне Web-разработчиков называется флудом (от англ. flood - поток, избыток). Злоумышленник может загрузить страницу с формой добавления сообщения к себе на локальный компьютер и добавить несколько сотен сообщений в гостевую книгу или форум. Для предотвращения такого вида атак существует два метода борьбы. ЗамечаниеЭлемент суперглобального массива $_SERVER['HTTP_REFERER'] содержит адрес страницы с которой посетитель пришёл на данную страницу. Проверка элемента суперглобального массива $_SERVER['REFERRER'] на предмет содержания в нём адреса исходного сайта, позволяет устранить данный вид атаки
Не стоит сильно надеяться на эту защиту, ведь HTTP_REFERER формируется браузером, а значит, может быть подделан. Поэтому когда необходима более надёжная защита необходимо прошить HTML-форму сессией.
Как видно HTML-форма содержит дополнительное поле с именем session_id. После того как пользователь нажимает на кнопку "Отправить" данные отправляются обработчику:
В котором значение поля session_id проверяется с текущим идентификатором сессии. Теперь несколько рекомендаций по защите сайта.1. Не используйте проверку на возращение строки (mysql_num_rows()), а применяйте следующий подход:
2. Не используйте на прямую foreach() для массивов переменных переданных от пользователя
Злоумышленник может подправить код и добавить еще один параметр к массиву.
3. Там где не требуется ввод большого объёма данных ограничивайте число вводимых в HTML-форму символов, за это несёт ответственность параметр maxlength тега input. Например, в следующем текстовом поле ввести можно не более 32 символов:
Можно организовать проверку и непосредственно в скрипте
И напоследок несколько блиц-советов:
Вот теперь, пожалуй, и все. Конечно, затронуты далеко не все вопросы создания безопасного кода на PHP и не так подробоно, как хотелось бы... но мы надемся продолжить рассмотрение данного вопроса в следующих статьях. Ссылки по теме
|
|