

Навигация Авторизация Мои проекты Рессурсы Лучшие Песни Курс валюты Доллар ⇒ 30.97 руб.
Евро ⇒ 39.33 руб. Нужные программы Метки/Теги Код кнопки сайта
|
PHP: фильтр от XSS и SQL-инъекций Предлагаю небольшое исследование на тему безопасности веб-приложений и фильтрации вводимых данных. Скорее всего, я ещё вернусь к этой теме, но сейчас больше хочется не писать трехтомник, а сохранить и упорядочить собранное и проверенное. В частности, речь пойдёт о фильтрационной защите от XSS-атак и SQL-инъекций. В PHP есть ряд специальных функций для работы со строками, применимых для этой цели. Вот они: strip_tags() – вырезает теги HTML и PHP из строки. htmlspecialchars() — конвертирует только специальные символы (‘&’, ‘”‘, ”’, ‘’) в HTML сущности (‘&’, ‘"’…). Используется для фильтрации вводимых пользователем данных для защиты от XSS-атак. htmlentities() – конвертирует все символы в строке (кроме букв) в мнемоники HTML. Используется для защиты от XSS, являясь более гибким аналогом htmlspecialchars. stripslashes() – удаляет заэкранированные символы (после преобразования в сущности предыдущими функциями их незачем экранировать). Обычно используется в связке с проверочной функцией get_magic_quotes_gpc(), показывающей текущую установку конфигурации magic_quotes_gpc. Эта конфигурация влияет на то, как будут обрабатываться специальные символы, содержащиеся в данных, передаваемых пользователем (массивы $_GET, $_POST, $_COOKIE). При magic_quotes_gpc = 1 эти спецсимволы (одиночные и двойные кавычки, обратный слэш, байт NULL) автоматически экранируются. При magic_quotes_gpc = 0 все данные передаются в таком виде, в каком их ввел пользователь. В последнем случае в целях безопасности требуется обрабатывать передаваемые данные. mysql_real_escape_string – мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов в кодировке соединения. Иными словами, функция превращает любую строку в правильную и безопасную для MySQL-запроса. Используется для очистки всех данных, передающихся в MySQL-запрос для защиты от SQL-инъекций. На основе этих данных, можно собрать функцию для однозначной очистки непроверенных данных. Эта функция получает две переменные – строку с введёнными символами и булево значение для определения – требуется ли приведение к MySQL-запросу. Возвращает функция очищенную строку. Конечно, это не панацея, но функцию легко изменить под собственные нужды. Пример с интернета: function inputclean($input, $sql=false) { $input = htmlentities($input, ENT_QUOTES, 'UTF-8'); // мнемонизировали строку. if(get_magic_quotes_gpc ()) { $input = stripslashes ($input); // убрали лишнее теперь экранирование. } if ($sql) { $input = mysql_real_escape_string ($input); // если нужен MySQL-запрос, то делаем соответствующую очистку. // Подключение к базе должно быть активным! } $input = strip_tags($input); //режем теги. $input=str_replace ("\n"," ", $input); $input=str_replace ("\r","", $input); //обрабатываем переводы строки. return $input; } // ---------------------------------------------------- // Дальше - пример использования для фильтрации данных // без MySQL и для фильтрации в качестве MySQL-запроса. // ---------------------------------------------------- $test1 = "'><a href='#test'> _</a>Безумная тестовая запись со всякими \n"; $test2 = "'';!--\"<XSS>=&{()}"; echo inputclean($test1); $link = mysql_connect("localhost", "root", "") or die("Could not connect"); echo inputclean($test2, true); Если кто-то обнаружит ошибки, или знает способ лучше – добро пожаловать в комментарии, мне очень интересно. Другие новости Информация Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации. |
