Валидация и очистка данных средствами PHP. Класс Validator для валидации POST данных Умалишенный validation php

Доброго всем вечера (скорее ночи – прим.ред.). Сегодня мы будем немного совершенствовать ту . Для начала научимся делать проверку формы на php и сделаем некоторые манипуляции по защите .

Итак, смотрим на код ниже и отмечаем для себя следующие изменения и следующие причины изменений. Все новые строки я выделил цветом.

Изменено название полей формы . Вы спросите – на кой хрен нам это надо? А всё просто, отвечу я вам. Насколько мне известно, то некоторые спам боты рыскают по сайтам в поисках форм, и заполняют их, ориентируясь на названия этих полей. По идее если они не находят совпадений, то уходят восвояси, чего нам и надо. Конечно степень этой защиты не думаю, что особо велик, но от нас не убудет, а если писем спама уменьшится на 1 письмо, это уже будет хорошо=).

Проверка на правильность ввода адреса почты . В 17 строке используется оператор elseif, который будет проверяться, если if вернул нам положительный ответ, то есть сказал, что адрес почты вообще отсутствует, то есть не был введён. Здесь мы используем функцию preg_match, которая позволяет сравнить введённый адрес с регулярным выражением . Про регулярные выражения возможно я напишу кратко потом, а пока стоит знать, что регулярное выражение создаёт некий шаблон, с которым сверяется наша строка. И если, в нашем случае, введённый адрес не совпадает с выражением, то опять же будет выведена ошибка. Для примера вот ещё парочку регулярных выражений:
|^[-а-яе\s\.,;:\?!]+$|i – это регулярное выражение позволяет использовать только русский алфавит и некоторые символы типа пробела, точки, запятой и пр.
#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i – а это выражение позволяет проверить правильность написание адреса в интернете.

Далее используется оператор else, куда уже перенесён весь наш код по отправке письма. Правила проверки можно создать самому в любом количестве, просто дописывайте новые elseif, как например для проверки адреса почты, и будет вам счастье.




Контактное лицо:



Почта для связи:



Сообщение:






Вот так можно проверять ваши формы на PHP, не прибегая ни к чему постороннему. В следующий раз в посте на тему форм, думается мне, будет рассмотрена валидация форм на jQuery. А пока жду ваших комментариев и пожеланий. Всем спокойной ночи и весёлого утра=).

It is very essential to have the input to your form validated before taking the form submission data for further processing. When there are many fields in the form, the PHP validation script becomes too complex. Moreover, since you are doing the same or similar validation for most of the forms that you make, just too much of duplicate effort is spent on form validations.

About this generic PHP form validation script

This generic PHP form validator script makes it very easy to add validations to your form.

We create and associate a set of “validation descriptors” with each element in the form. The “validation descriptor” is a string specifying the type of validation to be performed. For example, “req” means required, “alpha” means allow only alphabetic characters and so on.

Each field in the form can have zero, one or more validations. For example, the input should not be empty, should be less than 25 chars, should be alpha-numeric, etc

You can associate a set of validation descriptors for each input field in the form.

Download the PHP form validation script

You can download the PHP form validation script below:
The zip file contains the form validation script formvalidator.php, documentation and usage samples.

Using the PHP form validation script
  • Include formvalidator.php in your form processing script
  • require_once "formvalidator.php"
  • Create a FormValidator object and add the form validation descriptors.
  • $validator = new FormValidator(); $validator->addValidation("Name","req","Please fill in Name"); $validator->addValidation("Email","email", "The input for Email should be a valid email value"); $validator->addValidation("Email","req","Please fill in Email");

    The first argument is the name of the input field in the form. The second argument is the validation descriptor that tells the type of the validation required. The third argument is the error message to be displayed if the validation fails.

  • Validate the form by calling ValidateForm() function
  • if(!$validator->ValidateForm()) { echo "Validation Errors:"; $error_hash = $validator->GetErrors(); foreach($error_hash as $inpname => $inp_err) { echo "

    $inpname: $inp_err

    \n"; } } Example

    The example below will make the idea clearer

    Name: Email:

    Adding Custom Validation

    If you want to add a custom validation, which is not provided by the validation descriptors, you can do so. Here are the steps:

  • Create a class for the custom validation and override the DoValidate() function
  • class MyValidator extends CustomValidator { function DoValidate(&$formars,&$error_hash) { if(stristr($formars["Comments"],"http://")) { $error_hash["Comments"]="No URLs allowed in comments"; return false; } return true; } }

  • Add the custom validation object
  • $validator = new FormValidator(); $validator->addValidation("Name","req","Please fill in Name"); $validator->addValidation("Email","email", "The input for Email should be a valid email value"); $validator->addValidation("Email","req","Please fill in Email"); $custom_validator = new MyValidator(); $validator->AddCustomValidator($custom_validator);

    The custom validation function will be called automatically after other validations.

    Table of Validation Descriptors

    Here is the list of all validation descriptors:

    Validation Descriptor Usage
    req The field should not be empty
    maxlen=??? checks the length entered data to the maximum. For example, if the maximum size permitted is 25, give the validation descriptor as “maxlen=25”
    minlen=??? checks the length of the entered string to the required minimum. example “minlen=5”
    alnum Check the data if it contains any other characters other than alphabetic or numeric characters
    alnum_s Allows only alphabetic, numeric and space characters
    num Check numeric data
    alpha Check alphabetic data.
    alpha_s Check alphabetic data and allow spaces.
    email The field is an email field and verify the validity of the data.
    lt=???
    lessthan=???
    Verify the data to be less than the value passed. Valid only for numeric fields.
    example: if the value should be less than 1000 give validation description as “lt=1000”
    gt=???
    greaterthan=???
    Verify the data to be greater than the value passed. Valid only for numeric fields.
    example: if the value should be greater than 10 give validation description as “gt=10”
    regexp=??? Check with a regular expression the value should match the regular expression.
    example: “regexp=^{1,20}$” allow up to 20 alphabetic characters.
    dontselect=?? This validation descriptor is for select input items (lists) Normally, the select list boxes will have one item saying ‘Select One’. The user should select an option other than this option. If the value of this option is ‘Select One’, the validation description should be “dontselect=Select One”
    dontselectchk This validation descriptor is for check boxes. The user should not select the given check box. Provide the value of the check box instead of ??
    For example, dontselectchk=on
    shouldselchk This validation descriptor is for check boxes. The user should select the given check box. Provide the value of the check box instead of ??
    For example, shouldselchk=on
    dontselectradio This validation descriptor is for radio buttons. The user should not select the given radio button. Provide the value of the radio button instead of ??
    For example, dontselectradio=NO
    selectradio This validation descriptor is for radio buttons. The user should select the given radio button. Provide the value of the radio button instead of ??
    For example, selectradio=yes
    selmin=?? Select atleast n number of check boxes from a check box group.
    For example: selmin=3
    selone Makes a radio group mandatory. The user should select atleast one item from the radio group.
    eqelmnt=??? compare two elements in the form and make sure the values are the same For example, ‘password’ and ‘confirm password’. Replace the ??? with the name of the other input element.
    For example: eqelmnt=confirm_pwd
    методом POST. И первой задачей разработчика является валидация пользовательских данных пришедших методом POST. Как правило эта валидация сводится :
  • проверка заполнения всех обязательных полей
  • проверка корректности email-адреса или URL адреса , если таковы имеются
  • проверка корректности остальных данных (в поле ввода можно вводить лишь цифры или буквы , либо и то и другое , либо проверка уникальности логина в базе данных и т. д.)
  • фильтрация данных от вредоносного кода
  • Как правило все эти проверки повторяются и Вам приходится писать практически один и тот же код, для валидации POST данных , что приводит к дублирование php кода .

    Чтобы этого избежать мною был написан простой класс для валидации POST данных на PHP. Данный класс очень простой и легкий в использовании , и Вы можете использовать его в Ваших скриптах . Называется этот класс Validator .

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

    Что мне понравилось в библиотеке Form_validation, так это простота задания полей для валидации и собственно сама валидация . Для меня это стало отправной точкой при разработке своего класса валидации .

    Давайте взглянем на небольшой пример использования данного класса

    Require_once "validator.php"; $validator = new Validator (); $validator->set_rules("name","Ваше имя",array("required" => "Поле %s обязательно для заполнения ","alpha" => "Поле %s должно содержать только буквы ")); $validator->set_rules("email","Ваш email",array("required" => "Поле %s обязательно для заполнения ","valid_email" => "Поле %s должно содержать правильный email-адрес ")); if($validator->run()){ echo "Валидация прошла успешно "; } else{ echo $validator->get_string_errors(); }

    В начале мы подключаем файл класса validator.php к нашем скрипту . Далее создаем экземпляр класса и сохраняем объект в переменную $validator .
    Затем используя метод $validator->set_rules($field, $label, $rules) задаем поля для валидации .

    Данный метод принимает 3 параметра :

  • $field — имя поля валидации (значение атрибута name в теге )
  • $label — название поля валидации , будет подставляться в сообщения об ошибках
  • $rules — массив правил валидации , у которого в качестве ключа используется правило валидации , а в качестве значения — сообщение об ошибке для этого правила
  • После того , как все поля для валидации установлены , запускаем валидатор используя метод $validator->run() . Если валидация прошла успешно , то данный метод вернет значение TRUE , иначе , если есть хоть какие-то ошибки , вернет FALSE .

    Для того чтобы получить сообщения об ошибках существует три метода :

  • get_string_errors() - возвращает все сообщения об ошибках в виде строки
  • get_array_errors() - возвращает все сообщения в виде массива , где в качестве ключа используется имя поля , а в качестве значения — описание ошибки для этого поля .
  • form_error($field) — возвращает сообщение об ошибке для поля , переданного в качестве параметра $field
  • По умолчанию сообщения об ошибках оборачиваются в тег . Для того чтобы задать свое оформление используйте метод set_error_delimiters($prefix, $suffix) . Например так:

    $validator->set_error_delimiters("","");

    Теперь сообщения об ошибках будут оборачиваться в div с классом «error»

    Как видите все очень просто .

    Для установки правил валидации Вы можете методу set_rules($fields) передать многомерный ассоциативный массив . Давайте посмотрим на пример :

    $rules = array(array("field" => "name", "label" => "Ваше имя", "rules" => array("required" => "Поле %s обязательно для заполнения ", "alpha" => "Поле %s должно содержать только буквы ")), array("field" => "email", "label" => "Ваш email", "rules" => array("required" => "Поле %s обязательно для заполнения ", "valid_email" => "Поле %s должно содержать правильный email-адрес "))); $validator->set_rules($rules);

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

    Итак , какие же правила валидации поддерживает данный класс ?

    Я вынес в этот класс наиболее распространенные правила валидации , с которыми сталкивается каждый . Вот полный список этих правил :

    required Возвращает FALSE если поле не заполнено
    integer Возвращает FALSE если значение не является целым числом
    float Возвращает FALSE если значение не числового вида
    valid_url Возвращает FALSE если значения не является корректным URL адресом
    valid_email Возвращает FALSE если значения не является корректным e-mail адресом
    valid_ip Возвращает FALSE если IP-адрес не является действительным
    matches Возвращает FALSE если элемент не соответствует значению другого элемента field
    alpha Возвращает FALSE если элемент содержит не только буквы
    valid_captcha Возвращает FALSE если значение в сессии field не равно значению поля формы
    valid_date Возвращает FALSE если элемент содержит не корректную дату

    Большинство этих правил используют фильтры , которые стали доступны в PHP 5.

    Речь пойдет о валидации POST или GET данных, хотя принципе это можно отнести и к данным полученным другими способами, например куки. По мере разработки какого либо веб приложения требуется писать интерфейс взаимодействия с пользователями и естественно создавать различные формы для отправки пользователями данных на сервер. например это могут быть комментарии. Думаю всем понятно и очевидно, что пришедшие данные нужно проверять, соответствуют ли они типу, размеру, заданному диапазону. В первую очередь это требуется для безопасности системы, сайта или базы данных, т.к. неправильно переданные данные или умышленно не правильно сформированный запрос может открыть доступ для злоумышленника.

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

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

    Немного отступления от темы:
    Работа над проектами, разработка и программирование сайтов, скриптов, прочих систем занимает практически всё мое свободное время (по мимо рабочего), иными словами я занимаюсь этим делом максимально возможное количество часов в сутки. Время от времени возникает потребность в тестировании чего либо, ради забавы или просто любопытства. В итоге подобными тестируемыми лабораторными крысами становятся сайты сделанные на скорую руку, на самописных движках или на CMS древних версий. разумеется всё перечисленное страдает от криво написанного кода, нехватки котроля за данными и просто кишит различными багами. Собственно, в большинстве случаем за час моих экспериментов над такими сайтами мне удается найти несколько серьезных уязвимостей и большинство из них кроется в недостаточной валидации пришедших данных. В последнее время часто это встречается в скриптах обрабатывающих POST данные пришедших от JavaScript + Ajax.

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

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

    Думаю важность валидации всем понятна. На протяжении длительно времени я писал каждый раз один и тот же кусок кода, затем использовал собственные функции проверки данных, многие из которых были весьма примитивны и как правило разбросаны в разных частях (прииклюденных) файлов. В скором я начал знакомится с PHP фреймворками Zend, CI, Kohana, в каждом из был реализован свой класс для валидации данных, которые я заимствовал для своих проектов. В конце концов я решил заточить один из классов CI под свои нужды, но оказалось, что об этом уже позаботился автор одного из блогов по программированию. Далее делюсь его трудами, а именно модифицированной библиотекой CodeIgniter.

    Разберем следующий код :

    Просмотр кода PHP

    require_once "validator.class.php" ; $validator = new Validator() ; $validator -> set_rules ("name" , "Ваше имя" , array ("required" => , "alpha" => ) ) ; $validator -> set_rules ("email" , "Ваш email" , array ("required" => "Поле %s обязательно для заполнения" , "valid_email" => ) ) ; if ($validator -> run () ) { echo "Валидация прошла успешно" ; } else { echo $validator -> get_string_errors () ; }

    Как видно из примера, первой строкой мы подключаем файл класса validator.calss.php к нашем скрипту. Далее создаем экземпляр класса и сохраняем объект в переменную $validator .
    Затем используя метод $validator->set_rules($field, $label, $rules) задаем поля для валидации.

    Данный метод принимает 3 параметра:

  • $field - имя поля валидации (значение атрибута name в теге )
  • $label - название поля валидации, будет подставляться в сообщения об ошибках
  • $rules - массив правил валидации, у которого в качестве ключа используется правило валидации, а в качестве значения - сообщение об ошибке для этого правила
  • После того, как все поля для валидации установлены, запускаем валидатор используя метод $validator->run() . Если валидация прошла успешно, то данный метод вернет значение TRUE , иначе, если есть хоть какие-то ошибки, вернет FALSE .

    Для того чтобы получить сообщения об ошибках существует три метода:

  • get_string_errors() — возвращает все сообщения об ошибках в виде строки
  • get_array_errors() — возвращает все сообщения в виде массива, где в качестве ключа используется имя поля, а в качестве значения - описание ошибки для этого поля.
  • form_error($field) - возвращает сообщение об ошибке для поля, переданного в качестве параметра $field
  • По умолчанию сообщения об ошибках оборачиваются в тег . Для того чтобы задать свое оформление используйте метод set_error_delimiters($prefix, $suffix) . Например так:

    Теперь сообщения об ошибках будут оборачиваться в div с классом «error»

    Как видите все очень просто.

    Просмотр кода PHP

    $validator -> set_error_delimiters (" " , " " ) ;

    Для установки правил валидации Вы можете методу set_rules($fields) передать многомерный ассоциативный массив. Давайте посмотрим на пример:

    Просмотр кода PHP

    $rules = array ( array ( "field" => "name" , "label" => "Ваше имя" , "rules" => array ( "required" => "Поле %s обязательно для заполнения" , "alpha" => "Поле %s должно содержать только буквы" ) ) , array ( "field" => "email" , "label" => "Ваш email" , "rules" => array ( "required" => "Поле %s обязательно для заполнения" , "valid_email" => "Поле %s должно содержать правильный email-адрес" ) ) ) ; $validator -> set_rules ($rules ) ;

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

    Итак, какие же правила валидации поддерживает данный класс?

    Я вынес в этот класс наиболее распространенные правила валидации, с которыми сталкивается каждый. Вот полный список этих правил:

    required Возвращает FALSE если поле не заполнено
    integer Возвращает FALSE если значение не является целым числом
    float Возвращает FALSE если значение не числового вида
    valid_url Возвращает FALSE если значения не является корректным URL адресом
    valid_email Возвращает FALSE если значения не является корректным e-mail адресом
    valid_ip Возвращает FALSE если IP-адрес не является действительным
    matches Возвращает FALSE если элемент не соответствует значению другого элемента field
    alpha Возвращает FALSE если элемент содержит не только буквы
    valid_captcha Возвращает FALSE если значение в сессии field не равно значению поля формы
    valid_date Возвращает FALSE если элемент содержит не корректную дату

    Большинство этих правил используют фильтры , которые стали доступны в PHP 5.

    При желании вы всегда можете расширить набор правил для валидации, дописав нужные функции в класс Validator.

    Для того чтобы получить обработанное значение POST данных используется метод:

    Просмотр кода PHP

    Обычно данный метод вызываетя для очистки формы, при успешной обработке формы.

    Reg.ru: домены и хостинг

    Крупнейший регистратор и хостинг-провайдер в России.

    Более 2 миллионов доменных имен на обслуживании.

    Продвижение, почта для домена, решения для бизнеса.

    Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

    *Наведите курсор мыши для приостановки прокрутки.

    Назад Вперед

    Валидация и очистка данных средствами PHP

    Безопасность данных является очень важным моментом, который часто недооценивается как разработчиками, так и клиентами. Начиная с PHP 5.2.0 производить очистку и валидацию данных (проверку на соответствие определенным критериям) стало проще с введением фильтрации данных. Сегодня мы рассмотрим способы фильтрации, как использовать фильтры и создадим несколько пользовательских функций.

    Введение

    Я всегда чувствовал, что писать код на PHP легко, а еще легче писать на PHP плохой код. Широкому распространению PHP в сфере веб-разработки способствовали многие проекты с открытым исходным кодом (open-source) вроде WordPress, Drupal, Magento. Кроме того это и веб-приложения вроде Facebook и т.д. При столь широком применении PHP (динамические веб-сайты, платформы для блоггинга, системы управления контентом, использование в приложениях для электронной коммерции и др.) вероятность столкнуться с "грязной" информацией и небезопасными системами очень велика. Данное руководство покажет некоторые методы очистки и валидации данных с помощью PHP. Мы сфокусируем внимание на нескольких типах входных данных и на том, как использовать PHP-фильтры и пользовательские функции.

    Зачем очищать и проверять?

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

    Среди основных:

    - XSS (Cross-Site Scripting - Межсайтовый скриптинг)

    Это способ инъекции кода, когда скрипт внедряется в страницу атакуемого вебсайта с совершенно другого сайта на другом сервере. Эта уязвимость считается одной из самых распространенных в сети.

    - SQL-инъекция

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

    - CSRF/XSRF (Cross-Site Request Forgery - Подделка межсайтовых запросов)

    Данная уязвимость менее распространенная по сравнению с предыдущими. Обычно такого рода уязвимости возникают при работе с сессиями и cookies и реже - при плохо проверенных и очищенных данных. CSRF может использоваться для выполнения сайтом каких либо запросов без ведома пользователя. Один из известных способов реализации данной атаки - использование неверно сформированного атрибута src у картинки, что приводит к выполнению какого-либо скрипта, а не к отображению картинки.

    - Некорректная информация

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


    Перевод диалога к картинке:

    Здравствуйте, это из школы сына вас беспокоят. У нас тут неприятность с компьютерами.

    О Боже, он что, что-то сломал?

    Вашего сына действительно зовут Robert"); DROP TABLE students; ?

    О, да, мы зовем его Little Bobby Tables

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

    А я надеюсь, вы научитесь проверять заносимую в базу данных информацию.

    Для наших целей мы будем фокусироваться только на использовании серверных методов повышения безопасности информации, поэтому давайте посмотрим, как определяются термины "sanitization" и "validation" применительно к PHP. Обратимся к руководству по PHP:

    "Валидация используется для проверки того, отвечает ли проверяемая информация определенным требованиям. Например, используя FILTER_VALIDATE_EMAIL мы определяем, является ли информация корректным (т.е. верным по структуре) e-mail-адресом, но не изменяем эти данные.

    Очистка же подразумевает возможное изменение проверяемой информации, например - удаление нежелательных символов. Скажем, при использовании FILTER_SANITIZE_EMAIL будут удалены символы, которые не должны содержаться в e-mail-адресе. Т.е. в данном случае не происходит проверки корректности адреса (т.е. валидации), а удаляются заведомо неподходящие символы - не более того."

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

    Какие фильтры есть у меня?

    Все инсталляции PHP не могут быть идентичными. Несмотря на то, что фильтры были введены в PHP 5.2.0, не все инсталляции имеют одинаковый набор фильтров. В большинстве случаев все фильтры, о которых мы будем говорить, будут уже включены в установленный PHP на вашем сервере, но чтобы вы чуть больше знали о фильтрах, мы узнаем о том, что доступно именно на вашем сервере. В исходных кодах приложен файл getfilters.php , который, будучи однажды установленным и запущенным на сервере, отобразит список всех ваших фильтров (как фильтры информации, доступные через функцию filter_var , так и потоковые, доступные через stream_filter_append )

    Echo "Data Filters\n

    \n\n"; echo "\n"; echo "\n"; foreach(filter_list() as $id =>$filter) { echo "\n"; } echo "
    Filter IDFilter Name
    $filter".filter_id($filter)."
    \n";

    Сначала мы получаем массив, содержащий список всех доступных фильтров с помощью функции filter_list , после чего проходим циклом по массиву, выводя на экран имя фильтра и его ID.

    Как мне использовать фильтр?

    Фильтры PHP для валидации и очистки активируются посредством передачи функции filter_var как минимум двух параметров. В качестве примера давайте применим фильтр очистки для целого числа:

    $value = "123abc456def"; echo filter_var($value, FILTER_SANITIZE_NUMBER_INT);

    В этом примере у нас есть переменная value , которую мы передаем функции filter_var из расширения PHP Filters Extension, используя фильтр FILTER_SANITIZE_NUMBER_INT. В качестве результата мы получим:

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

    Что делают различные фильтры?

    Список ниже неполный, но он содержит большинство фильтров, которые идут в стандартной установке PHP 5.2.0+.

    FILTER_VALIDATE_BOOLEAN: Проверяет, является ли переданная информация булевым значением TRUE или FALSE. Если переданное значение - значение не типа Boolean, то возвращается FALSE. Скрипт ниже выведет TRUE для примера с переменной value1 value02 :

    $value01 = TRUE; if(filter_var($value01,FILTER_VALIDATE_BOOLEAN)) { echo "TRUE"; } else { echo "FALSE"; } echo "

    " $value02 = FALSE; if(filter_var($value02,FILTER_VALIDATE_BOOLEAN)) { echo "TRUE"; } else { echo "FALSE"; }

    FILTER_VALIDATE_EMAIL: Проверяет, является ли переданная информация корректным с точки зрения структуры e-mail адресом. Она не проверяет, существует ли этот адрес на самом деле, а только валидность адреса, т.е. правильность его структуры. Скрипт ниже выведет TRUE для примера с переменной value01 и FALSE для примера с переменной value02 (так как не хватает обязательной части со знаком @):

    $value01 = "[email protected]"; if(filter_var($value01,FILTER_VALIDATE_EMAIL)) { echo "TRUE"; } else { echo "FALSE"; } echo "

    " $value02 = "nettuts"; if(filter_var($value02,FILTER_VALIDATE_EMAIL)) { echo "TRUE"; } else { echo "FALSE"; }

    FILTER_VALIDATE_FLOAT: Проверяет, является ли переданное значение числом с плавающей точкой. Скрипт ниже выведет TRUE для примера с переменной value01 и FALSE для примера с переменной value02 (так как разделить "," не разрешен в числах с плавающей точкой):

    $value01 = "1.234"; if(filter_var($value01,FILTER_VALIDATE_FLOAT)) { echo "TRUE"; } else { echo "FALSE"; } echo "

    " $value02 = "1,234"; if(filter_var($value02,FILTER_VALIDATE_FLOAT)) { echo "TRUE"; } else { echo "FALSE"; }

    FILTER_VALIDATE_INT: Проверяет, является ли переданное значение целым числом. Скрипт ниже выведет TRUE для примера с переменной value01 и FALSE для примера с переменной value02 (десятичные числа не являются целыми):

    $value01 = "123456"; if(filter_var($value01,FILTER_VALIDATE_INT)) { echo "TRUE"; } else { echo "FALSE"; } echo "

    " $value02 = "123.456"; if(filter_var($value02,FILTER_VALIDATE_INT)) { echo "TRUE"; } else { echo "FALSE"; }

    FILTER_VALIDATE_IP: Проверяет, является ли переданное значение корректным IP-адресом. Она не проверяет, есть ли ответ от этого адреса, а лишь то, что переданное значение по своей структуре является IP-адресом. Скрипт ниже выведет TRUE для примера с переменной value01 и FALSE для примера с переменной value02 :

    $value01 = "192.168.0.1"; if(filter_var($value01,FILTER_VALIDATE_IP)) { echo "TRUE"; } else { echo "FALSE"; } echo "

    " $value02 = "1.2.3.4.5.6.7.8.9"; if(filter_var($value02,FILTER_VALIDATE_IP)) { echo "TRUE"; } else { echo "FALSE"; }

    FILTER_VALIDATE_URL: Проверяет, является ли переданное значение корректным URL-адресом. Она не проверяет, она не проверяет доступность ресурса, а лишь то, что соблюдена структура URL-адреса. Скрипт ниже выведет TRUE для примера с переменной value01 и FALSE для примера с переменной value02 :

    $value01 = "http://net.tutsplus.com"; if(filter_var($value01,FILTER_VALIDATE_URL)) { echo "TRUE"; } else { echo "FALSE"; } echo "

    " $value02 = "nettuts"; if(filter_var($value02,FILTER_VALIDATE_URL)) { echo "TRUE"; } else { echo "FALSE"; }

    FILTER_SANITIZE_STRING: По умолчанию данный фильтр удаляет любую некорректную или не разрешенную информацию в строке. Например, она удалит любые тэги HTML вроде или из входящей строки:

    $value = "alert("TROUBLE HERE");"; echo filter_var($value, FILTER_SANITIZE_STRING);

    Данный скрипт удалит тэги и вернет следующее:

    Alert("TROUBLE HERE");

    FILTER_SANITIZE_ENCODED: Многие программисты используют функцию urlencode() . Данный фильтр по сути выполняет те же функции. Например, следующий пример выполнит кодирование любых спецсимволов и пробелов во входящей строке:

    $value = "alert("TROUBLE HERE");"; echo filter_var($value, FILTER_SANITIZE_ENCODED);

    Скрипт закодирует пунктуацию, пробелы, скобки и вернет следующее:

    %3Cscript%3Ealert%28%27TROUBLE%20HERE%27%29%3B%3C%2Fscript%3E

    FILTER_SANITIZE_SPECIAL_CHARS: Данный фильтр по умолчанию производит HTML-кодирование спецсимволов вроде кавычек, амперсандов и скобок. Так как демо-страница не может явно показать это (так как HTML-кодированные спецсимволы будут проинтерпретированы браузером и отображены), вы можете увидеть это, если заглянете в исходный код:

    $value = "alert("TROUBLE HERE");"; echo filter_var($value, FILTER_SANITIZE_SPECIAL_CHARS);

    Произойдет конвертация спецсимволов в их HTML-сущности:

    FILTER_SANITIZE_EMAIL: Этот фильтр делает именно то, о чем подумал каждый из нес. Он удаляет из адреса символы, которых не должно быть в адресе (круглые и квадратные скобки, двоеточия и т.п.) Положим, вы случайно добавили в ваш адрес скобки вокруг какой-либо буквы (не спрашивайте, как, включите ваше воображение:))

    $value = "t(e)[email protected]"; echo filter_var($value, FILTER_SANITIZE_EMAIL);

    Произойдет удаление скобок и вы получите на выходе свой чистый и красивый е-mail:

    [email protected]

    Это отличный фильтр, который можно использовать в формах для ввода e-mail, особенно в паре с FILTER_VALIDATE_EMAIL, что позволит снизить число ошибок пользователей и предотвратить атаки типа XSS.

    FILTER_SANITIZE_URL: Данный фильтр похож на предыдущий. Он удаляет любые символы, недопустимые в URL. К примеру, скажем, в адресе случайно оказался знак "®". Опять же, как он туда попал - сплошная загадка.

    $value = "http://net.tuts®plus.com"; echo filter_var($value, FILTER_SANITIZE_URL);

    Таким образом мы удалим ненужный знак "®" и получим нормальный адрес:

    Http://net.tutsplus.com

    FILTER_SANITIZE_NUMBER_INT: Данный фильтр похож на FILTER_VALIDATE_INT, но вместо простой проверки на то, является ли число целым, он еще и удаляет все, что не является целым числом. Отличная вещь, особенно против надоедливых спам-ботов и обманщиков, норовящих ввести в поле какую-нибудь ерунду:

    $value01 = "123abc456def"; echo filter_var($value01, FILTER_SANITIZE_NUMBER_INT); echo "
    "; $value02 = "1.2.3.4.5.6.7.8.9"; echo filter_var($value02, FILTER_SANITIZE_NUMBER_INT);

    123456 123456789

    FILTER_SANITIZE_NUMBER_FLOAT: Похож на FILTER_VALIDATE_INT. Точно также позволяет добиться аналогичного эффекта:

    $value01 = "123abc456def"; echo filter_var($value01, FILTER_SANITIZE_NUMBER_FLOAT); echo "
    "; $value02 = "1.2.3.4.5.6.7.8.9"; echo filter_var($value02, FILTER_SANITIZE_NUMBER_FLOAT);

    Оба набора символов преобразуются и на выходе получаем следующую картину:

    123456 123456789

    $value = "1.23"; echo filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT);

    Точка будет удалена и возвращено значение:

    Одна из главных причин того, что фильтры FILTER_SANITIZE_NUMBER_FLOAT и FILTER_SANITIZE_INT разделены - это возможность использовать специальный флаг FILTER_FLAG_ALLOW_FRACTION, который идет как третий параметр, передаваемый функции filter_var :

    $value = "1.23"; echo filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

    Опции, флаги и контролирующие массивы - Майн Готт!

    Флаг, использовавшийся в предыдущем примере - лишь один из способов получить более детальный контроль над типами данных, которые будут подвергаться очистке, определениями ограничителей, тем, как обрабатываются фильтрами массивы и др. Узнать больше про флаги и функции, используемые всвязи с применением фильтров вы можете в руководстве PHP, в части, посвященной Фильтрам - php.net/manual/en/book.filter.php .

    Другие методы очистки информации средствами PHP

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

    htmlspecialchars: эта функция PHP преобразует 5 специальных символов в соответствующие HTML-сущности.

    Преобразованию подвергаются:

    & (амперсанд)
    " (двойные кавычки) когда не установлен флаг ENT_NOQUOTES
    ’ (одинарные кавычки) только когда установлен флаг ENT_QUOTES
    < (меньше, чем)
    > (больше, чем)

    Используется данная функция точно так же, как и любая другая в PHP:

    Echo htmlspecialchars("$string");

    htmlentities: Подобно функции htmlspecialchars эта функция конвертирует специальные символы в их HTML-сущности. Все отличие в том, что в данном случае конвертируются все спецсимволы, которые могут быть конвертированы. Это достаточно распространенный метод для запутывания (обфускации) e-mail-адресов от спам-ботов, так как далеко не все из них настроены на чтение html-сущностей:

    Echo htmlentities("$string");

    mysql_real_escape_string: Это функция MySQL, помогающая защититься от атак типа SQL-инъекция. Считается хорошей практикой (а по сути необходимостью) пропускать всю информацию передаваемую SQL-запросу через эту функцию. Она экранирует все опасные спецсимволы, которые могут вызвать проблемы и стать причиной того, что little Bobby Tables уничтожит еще одну таблицу в школьной базе данных.

    $query = "SELECT * FROM table WHERE value=".mysql_real_escape_string("$string")." LIMIT 1,1"; $runQuery = mysql_query($query);

    Пользовательские функции

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

    Function checkZipCode($value) { $zipcheck = "SELECT COUNT(*) FROM `database`.`zipcodes` WHERE value="".filter_var(mysql_real_escape_string($value),FILTER_SANITIZE_NUMBER_INT)."""; $count = mysql_query($zipcheck); if($count==1) { return TRUE; } else { return FALSE; } }

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

    Function cleanString($string) { $detagged = strip_tags($string); if(get_magic_quotes_gpc()) { $stripped = stripslashes($detagged); $escaped = mysql_real_escape_string($stripped); } else { $escaped = mysql_real_escape_string($detagged); } return $escaped; }

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

    Понравился материал и хотите отблагодарить?
    Просто поделитесь с друзьями и коллегами!


    Вверх