Лекции     Книги     Рефераты    
Диплом, курсовая на заказ

Фильтрация данных, полученных от пользователя.

Одной из наиболее распространенных ошибок, приводящих к уязвимости PHP сценария, является недостаточная фильтрация полученных от пользователя данных, позволяющая злоумышленнику внедрить потенциально опасный код в передаваемые обработчику данные.
Принимая данные, посланные в качестве GET параметров, либо из формы, передаваемой методом POST, необходимо быть на 100% уверенными в корректности и безопасности передаваемых данных

Для проверки полученных от пользователя данных мы будем использовать регулярные выражения. Прежде чем перейти к примерам, необходимо четко определить,
каким образом будет выполняться запрет или допуск определенных символов.
Наиболее частой ошибкой является использование регулярных выражений, запрещающих определенные символы, но разрешающих любые другие. Мы же будем действовать иначе – запрещать ВСЕ, что не разрешено.
Тоесть, наше правило не: “разрешено ВСЕ, что не запрещено “, а “разрешено ТОЛЬКО то, что разрешено”!

Чтобы понять, что именно необходимо фильтровать, нужно четко представлять, что должно передаваться в параметрах. Например, наша форма содержит поля ввода для следующих данных: фамилия, имя, e-mail, пол, дата
рождения, возраст и примечание.

Давайте рассмотрим каждое из полей и определим, какие символы можно разрешить к вводу:

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

$str=ereg_replace(“[^a-zA-Z]“, “”, $str);

В данном выражении мы запрещаем все, кроме букв от А до Z в нижнем
и верхнем регистре. То есть, нет необходимости перечислять все запрещенные
символы и заботиться о том, чтобы ничего не упустить.

Email – тут немного сложнее. Давайте попробуем сформулировать задачу… Необходимо проверить, что введенная строка: содержит некоторое количество допустимых символов (допускаем буквенные символы, цифры, а так же знаки тире и подчеркивания), затем содержит символ ‘@’ (‘at’) (именуемый в народе “собакой”), затем опять некоторое количество допустимых символов, затем точку, и после точки от двух до 4 только буквенных символов… Все это реализуем регулярным выражением:

if (!preg_match(“/^(?:[a-z0-9]+(?:[-_]?[a-z0-9]+)?@[a-z0-9]+(?:\.?[a-z0-9]+)?\.[a-z]{2,4})$/i”, $email))
{
echo “Неверный email!”;
}
else echo ОК!’;

Пол — может принимать только одно из значений: ‘M’ или ‘F’. Любые другие символы беспощадно обрезаем. Регулярное выражение может выглядеть
следующим образом:

$sex=ereg_replace(“[^MF]“, “”, $sex);

В результате все символы, кроме указанных двух , будут удалены из
параметра.

Дата рождения – удалить все, кроме цифр и символа точки,
используемой в качестве разделителя числа, месяца и года:

$bdate=ereg_replace(“[^0-9.]“, “”, $bdate);

Возраст — это число, значит, параметр не должен содержать ничего, кроме
цифр.

$str=ereg_replace(“[Л0-9]“, “”, $str);

Примечание – это самая сложная переменная, так как представляет собой некий текст, который может ввести пользователь.
Как минимум,
здесь необходимо запретить любые теги:

$str=ereg_replace(“<[A-Z]{1,}>”, “”, $str);


Обсуждения

1 комментарий к “Фильтрация данных, полученных от пользователя.”
  1. AlexDIXI пишет:

    Хороший урок. Но я конечно использую preg_match потому что он быстрее обрабатывает..

Добавить комментарий

Вы должны войти



© 2009 - 2010 | Webteach.ru | Образовательный портал