Php скрипт проверки данных

Безопасность PHP — Проверка поступивших данных

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

//———————— Процедура записи в лог фаил ————————//
function writelog($typelog, $log_text) $log = fopen(‘logs/’.$typelog.’.txt’,’a+’);
fwrite($log, «$log_text\r\n»);
fclose($log);
>
//—————————————————————————-//
Здесь особо пояснять нечего — элементарная запись текстовой строчки $log_text в фаил лога $typelog (см. работа с файлами в PHP).

Функция проверки поступивших данных

Все поступившие данные необходимо в начале привести к подобающему виду, затем проверить на «плохие» слова и произвести экранирование кавычек. Давайте, всё разберем на конкретном примере:

//——————— Процедура обработки получаемых данных —————-//
function checkrequest($textrequest) // Удираем лишние пробелы
$textrequest = trim($textrequest);
// Производим конвертацию в необходимую кодировку (нужно если у Вас проект использует кодировку отличную от UTF-8)
// $textrequest = iconv(«UTF-8», «WINDOWS-1251», $textrequest);
// Фиксируем атаки
if (preg_match(«/script|http|<|>|<|>|SELECT|UNION|UPDATE|exe|exec|INSERT|tmp/i»,$textrequest)) writelog(‘hack’, date(«y.m.d H:m:s»).»\t».$_SERVER[‘REMOTE_ADDR’].»\t».$textrequest);
$textrequest = »;
>
// Очищаем опасные запросы
if (preg_match(«/[^(\w)|(А-Яа-я-&=.,@():;)|(\s)]/»,$textrequest)) $textrequest = »;
>
// Если не число, то экранируем ковычки
if (!is_numeric($textrequest)) $textrequest = mysql_real_escape_string($textrequest);
>

  • Первой строкой кода удаляем лишние пробелы — они нам не нужны
  • Второй строкой кода производим конвертацию в необходимую кодировку. Это нам понадобиться если мы используем в проекте кодировку отличную от UTF-8 и работаем с ajax. Зачем нам это нужно? На своём личном опыте Я убедился, что несмотря на то, что везде где можно (установки сервера, базы, заголовки) указывается используемая кодировка, броузеры могут реагировать совершенно непредсказуемо и присылать запросы в кодировке UTF-8. Естественно, если Вы используете кодировку UTF-8, то данная строка не нужна, поэтому она у меня закомментирована. Хочу предупредить, что и эта строка не «панацея», так как конвертация не работает для сложных структур (например, массивов).
  • Третьей строкой кода фиксируем «нехорошие» слова в поступивших данных. Если такое слово найдено, делаем запись в лог (см. функцию выше) и очищаем переменную поступивших данных.
  • Четвёртой строкой кода проверяем поступившие данные по «белому списку». «Белый список» — это список допустимых символов, «черный список» — запрещённых символов, соответственно. Почему проверяем именно по первому списку? Потому что, иначе имеется возможность забыть указать какой-нибудь нехороший символ, т.к. их весьма-весьма много (примеры приводить не буду — об этом уже много написано до меня). В моём случаи Я разрешаю использовать только латинские и русские буквы, цифры и несколько необходимых символов. Если данные не прошли проверку, то мы их очищаем.
  • Пятой строкой кода экранируем кавычки при помощи mysql_real_escape_string. Обратите внимание, что экранируются только не числовые значения (!is_numeric). Это делается для того, чтобы не использовать лишний раз функцию mysql_real_escape_string, которая «съедает» примерно 0.0001 сек.
Читайте также:  Current date to timestamp java

Источник

Проверка (валидация) форм PHP

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

Что такое валидация?

Валидация означает проверку данных, вводимых пользователем. В PHP доступны два типа проверки:

  • Валидация на стороне клиента — проверка выполняется на стороне клиента в веб-браузере.
  • Валидация на стороне сервера — после отправки данных на сервер их проверка осуществляется на серверной стороне.

Ниже приведена HTML-форма, которая содержит различные поля ввода: обязательные (required) и необязательные текстовые поля, переключатели (радио-кнопки) и кнопку отправки (submit). С этой формой мы будем с вами работать в этой главе. Попробуйте ввести данные:

Некоторые из правил проверки нашей формы:

Поле формы Правила валидации
Имя Обязатеьно для заполнения + Должно содержать только буквы и пробелы
E-mail Обязатеьно для заполнения + Требуются символ собачка (@) и точка (.)
Веб-сайт Необязательно для заполнения. Проверяется наличие валидного URL
Комментарий Необязательно для заполнения. Многострочное поле ввода (текстовое поле)
Образование Обязатеьно для заполнения + Должна быть выбрана хотя бы одна кнопка

Текстовые поля

Поля для ввода имени, адреса электронной почты и веб-сайта создается с помощью элемента (от англ. input — ввод) с атрибутом type=»text», а поле для комментария применяется элемент (текстовая область). HTML-код выглядит так:

Радио-кнопки

В нашей форме выбор образования осуществляется с помощью элементов типа radio (переключатели), которые используют принцип логического «ИЛИ», позволяя выбрать только одно из нескольких значений: если вы выбираете одно положение, то все остальные становятся неактивными:

Элемент формы (form)

Главным для элемента является атрибут action, который указывает обработчик данных для формы. Обработчик данных — это файл, описывающий, что нужно делать с данными формы. Данные формы отправляются с помощью method = «post»:

$_SERVER [«PHP_SELF»] — это суперглобальная переменная, которая возвращает имя файла текущего выполняемого скрипта-обработчика.

Переменная $_SERVER [«PHP_SELF»] отправляет данные из формы на саму же страницу с формой, вместо перехода на другую страницу. Таким образом, пользователь будет получать сообщения об ошибках на той же странице, где заполняется форма.

Функция htmlspecialchars() преобразует данные, введенные пользователем, которые могут содержать нежелательные HTML-тэги. Производятся следующие преобразования:

Эти манипуляции предотвращает использование злоумышленниками кода путем внедрения скрипта (атаки с межсайтовым скриптингом) в формы.

Примечание о безопасности форм PHP

Учтите, что переменная $_SERVER [«PHP_SELF»] может использоваться хакерами!

Если Вы используете на странице сайта PHP_SELF, то пользователь может ввести в адресной строке косую черту (/), а затем выполнить несколько команд межсайтового скриптинга (XSS).

Примечание: XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») — тип атаки на веб-системы, заключающийся во внедрении в выдаваемую веб-системой страницу вредоносного кода (который будет выполнен на компьютере пользователя при открытии им этой страницы) и взаимодействии этого кода с веб-сервером злоумышленника. XSS позволяет злоумышленникам внедрять клиентские скрипты в веб-страницы, просматриваемые другими пользователями..

Предположим, у нас есть следующая форма на странице с именем «send_form.php»:

Теперь, если пользователь вводит обычный URL-адрес в адресной строке, например «http://site_name.com/send_form.php», приведенный выше код будет преобразован в:

Теперь пользователь вводит URL-адрес в адресной строке и после косой черты несколько команд межсайтового скриптинга:

http://site_name.com/send_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

После таких манипуляция приведенный выше код будет переведен на:

Этот код добавляет тег скрипта и команду предупреждения alert. Когда страница начнёт загружаться, код JavaScript будет выполнен и пользователь увидит окно предупреждения. Дальнейшая загрузка страницы прекратится до тех пор, пока пользователь не кликнет ОК. Это простой пример того, как можно использовать переменную PHP_SELF.

Примечание: Имейте в виду, что любой код JavaScript можно внедрить внутрь тега >! Хакер может перенаправить посетителя сайта к файлу на другом сервере, а тот файл может содержать вредоносный код. Этот код, в свою очередь, может изменять глобальные переменные или пренаправлять данные формы на другой адрес, например, для кражи пользовательской информации.

Как избежать эксплойтов $_SERVER[«PHP_SELF»]?

Экспло́йт (англ. exploit, эксплуатировать) — это фрагмент вредоносного программного кода либо последовательность команд, которые используют уязвимости в программе и применяеются для проведения хакерской атаки.

Чтобы избежать экспойты нужно переменную $_SERVER[«PHP_SELF»] предать в качестве аргумента в функцию htmlspecialchars() :

Функция htmlspecialchars() преобразует специальные символы (в нашем случае угловые скобки < и >) в объекты HTML. Теперь, если пользователь попытается использовать переменную PHP_SELF с целью внедрения стороннего кода, это приведет к следующему выводу:

Первым делом передадим все переменные формы в функцию PHP htmlspecialchars() . Эта функция возвращает строку, над которой проведены рассмотренные выше преобразования. Этих преобразований достаточно для защиты от эксплойта.

Теперь код можно безопасно отображать на странице или в электронном письме.

Сдедующим шагом применим ещё две функции:

  1. Из данных, вводимых пользователем (с помощью PHP функции trim() ) удалим ненужные символы (лишние пробелы, табуляции, переходы на новую строку)
  2. C помощью PHP функции stripslashes() из данных, вводимых пользователем, удалим обратную косую черту (\)

И, наконец, создадим функцию, которая будет выполнять все рассмтренные проверки за нас, что намного удобнее, чем писать один и тот же код снова и снова. Назовем функцию test_input().

В следующем примере будем проверять каждую переменную $_POST с помощью функции test_input():

Пример

 //определим переменные и установим пустые значения 
$name = $email = $education = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") $name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$education = test_input($_POST["education"]);
> function test_input($data) $data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
> ?>

В начале сценария мы проверяем, используя суперглобальную переменную $ _SERVER [«REQUEST_METHOD»], была ли отправлена ​​форма. Если для запроса страницы был использован метод POST, значит, форма была отправлена ​​— и ее нужно проверить. Если форма не была отправлена — пропускаем проверку и отображаем пустую форму.

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

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

Источник

Оцените статью