Безрассудный validation php. Валидация и очистка данных средствами PHP. Проверка того, что файл изображение

Validation of data is a fundamentally important aspect of a CRUD application. You need to be sure that the data that the client is sending you is what you expect. This is not just for security reasons, protecting your data from misuse and intentional corruption, but also simply from unintentional mistakes in submitting data. Strings limited to a certain length, dates in a particular format and required fields are all common uses of data validation.

The Editor PHP libraries provide two different validation methods:

  • Field based, where each individual value submitted is independently validated: Field->validator() .
  • Global validation, where the data submitted by the client-side can be validated as a whole: Editor->validator() .
Legacy information (v1.6-)

Please note that PHP validation in Editor 1.6 and older was a little different. The older form of validation will still work with the 1.7+ libraries and its documentation remains available , but for new projects use the validation style discussed here.

Field validation is the one you will most commonly work with - for example checking that an e-mail address field actually contains an e-mail address, and Editor provides a number of ready to use validators for the most common data types as well as the ability to specify your own. Global validation can be useful when checking dependencies between fields and conflicts in the existing data set.

Field validation

The Editor PHP libraries provide a validator() method for the Field class and a number of pre-built validation methods in the Validate class. Each of these validation methods returns a function which is executed when required to validate submitted data.

Consider the following example - the Validate::minNum() function is configured with a number and returns a function that can be used for the field validator.

Field::inst("age") ->validator(Validate::minNum(16));

Please see below for more detailed examples.

Validation options

Each validation method provided by the Validation class can optionally accept parameters to tell it how to validate data (for example the minLen method will accept an integer to indicate the minimum length of an acceptable string), but all optionally accept a ValidateOptions class instance. This class defines a number of options that are shared between all validation methods.

The ValidateOptions class is constructed with ValidateOptions::inst() (or new ValidateOptions() in PHP 5.4+) similar to the other Editor classes. It has three methods that can be used to alter the validation behaviour:

  • ->allowEmpty(boolean) : How to handle empty data (i.e. a zero length string):
    • true (default) - Allow the input for the field to be zero length
    • false - Disallow zero length inputs
  • ->message(string) : the error message to show if the validation fails. This is simply "Input not valid" by default, so you will likely want to customise this to suit your needs.
  • ->optional(boolean) : Require the field to be submitted or not. This option can be particularly useful in Editor as Editor will not set a value for fields which have not been submitted - giving the ability to submit just a partial list of options.
    • true (default) - The field does not need to be be in the list of parameters sent by the client.
    • false - The field must be included in the data submitted by the client.
Example - setting a custom error message Field::inst("stock_name") ->validator(Validate::minNum(10, new ValidateOptions::inst() ->message("Stock name must be at least 10 characters long"))); Multiple validators

It can often be useful to use multiple validators together, for example to confirm that an input string is less than a certain number of characters and also that it is unique in the database. Multiple validators can be added to a field simply by calling the Field->validator() method multiple times. Rather than overwriting the previous validator it will in fact add them together. They are run in the sequence they were added, and all validators must pass for the data to be accepted as valid.

As an example consider the following code which will check the min and max length of the data, and also that it is unique:

Field::inst("stock_name") ->validator(Validate::minLen(10)) ->validator(Validate::maxLen(12)) ->validator(Validate::unique());

Ready to use field validators

The Validate class in the Editor PHP libraries has a number of methods which can be used to perform validation very quickly and easily. These are:

Basic
  • none(ValidateOptions $cfg=null) - No validation is performed
  • basic(ValidateOptions $cfg=null) - Basic validation - only the validation provided by ValidateOptions is performed
  • required(ValidateOptions $cfg=null) - The field must be submitted and the data must not be zero length. Note that Editor has the option of not submitting all fields (for example when inline editing), so the notEmpty() validator is recommended over this one.
  • notEmpty(ValidateOptions $cfg=null) - The field need not be submitted, but if it is, it cannot contain zero length data
  • boolean(ValidateOptions $cfg=null) - Check that boolean data was submitted (including 1, true on, yes, 0, false, off and no)
Numbers
  • numeric(string $decimalChar=".", ValidateOptions $cfg=null) - Check that any input is numeric.
  • minNum(integer $min, string $decimalChar=".", ValidateOptions $cfg=null) - Numeric input is greater than or equal to the given number
  • maxNum(integer $max, string $decimalChar=".", ValidateOptions $cfg=null) - Numeric input is less than or equal to the given number
  • minMaxNum(integer $min, integer $max, string $decimalChar=".", ValidateOptions $cfg=null) - Numeric input is within the given range (inclusive)
Strings
  • email(ValidateOptions $cfg=null) - Validate an input as an e-mail address.
  • ip(ValidateOptions $cfg=null) - Validate as an IP address.
  • minLen(integer $min, ValidateOptions $cfg=null) - Validate a string has a minimum length.
  • maxLen(integer $max, ValidateOptions $cfg=null) - Validate a string does not exceed a maximum length.
  • minMaxLen(integer $min, integer $max, ValidateOptions $cfg=null) - Validate a string has a given length in a range
  • noTags(ValidateOptions $cfg=null) - Don"t allow HTML tags
  • url(ValidateOptions $cfg=null) - Validate as an URL address.
  • values(array $values, ValidateOptions $cfg=null) - Allow only values which have been specified in an array of options (the first parameter). This could be useful if you wish to have free-form input or event a select list, and want to confirm that the value submitted is within a given data set (see also the dbValues() method if valid values are stored in a database). Note that the values given in the values array are checked against the submitted data as case-sensitive data (i.e. `"A" != "a").
  • xss(ValidateOptions $cfg=null) - Check to see if the input could contain an XSS attack . This used the Field "s XSS formatting function to determine if the input string needs to be formatted or not.
Date / time
  • dateFormat(string $format, ValidateOptions $cfg=null) - Check that a valid date input is given. The format is defined by PHP"s date() method which is used for the parsing of date and time string.
Database
  • dbValues(ValidateOptions $cfg=null, string $column=null, string $table=null, Database $db=null, array $valid=null) - Allow only a value that is present in a database column. This is specifically designed for use with joined tables (i.e. ensure that the reference row is present before using it), but it could potentially also be used in other situations where referential integrity is required.
  • unique(ValidateOptions $cfg=null, string $column=null, string $table=null, array $db=null) - Ensure that the data submitted is unique in the table"s column.
One-to-many (Mjoin)

Note that these methods are for use with the Mjoin->validator() method (Editor 1.9 and newer). Please see the Mjoin documentation for more details.

  • mjoinMinCount($minimum, ValidateOptions $cfg=null) - Require that at least the given number of options / values are submitted for the one-to-many join.
  • mjoinMaxCount($maximum, ValidateOptions $cfg=null) - Require that this many or less options / values are submitted for the one-to-many join.
Custom field validators

If the provided methods above don"t suit the kind of validation you are looking for, it is absolutely possible to provide custom validation methods. The validator() Field method will accept a function that returns either true or a string and accepts the following input parameters:

  • value - The value to be validated
  • data - The collection of data for the row in question
  • field -The host Field instance
  • host - Information about the host Editor instance
  • The return value should be true to indicate that the validate passed, or a string that contains an error message if the validation failed.

    The following simple example shows how a maxLen string check could be implemented with a custom validation method:

    Field::inst("last_name") ->validator(function ($val, $data, $field, $host) { return strlen($val) > 50 ? "Name length must be 50 characters or less" : true; });

    Field validation examples

    Use the Validation.minNum() method to validate an input as numeric and greater or equal to a given number (no validation options specified, so the defaults are used):

    // Simple non-empty field Field::inst("age") ->validator(Validate::minNum(16))

    As above, but with ValidateOptions used to set the error message:

    // Number range check with custom error message Field::inst("range") ->validator(Validate::minNum(16, ValidateOptions::inst() ->message("Minimum age is 16")));

    This time validating an e-mail address which cannot be empty and must be submitted:

    Field::inst("email") ->validator(Validate::email(ValidateOptions::inst() ->allowEmpty(false) ->optional(false)));

    A join with dbValues which will accept an empty value, which is stored as null on the database:

    Field::inst("users.site") ->options(Options::inst() ->table("sites") ->value("id") ->label("name")) ->validator(Validate::dbValues()),

    Allow only certain values to be submitted:

    Field::inst("group") ->validator(Validate::values(array("CSM", "FTA", "KFVC")))

    The following shows a complete Editor example with validation methods applied:

    Ditor::inst($db, "staff") ->fields(Field::inst("first_name") ->validator(Validate::notEmpty(ValidateOptions::inst() ->message("A first name is required"))), Field::inst("last_name") ->validator(Validate::notEmpty(ValidateOptions::inst() ->message("A last name is required"))), Field::inst("position"), Field::inst("email") ->validator(Validate::email(ValidateOptions::inst() ->message("Please enter an e-mail address"))), Field::inst("office"), Field::inst("extn"), Field::inst("age") ->validator(Validate::numeric()) ->setFormatter(Format::ifEmpty(null)), Field::inst("salary") ->validator(Validate::numeric()) ->setFormatter(Format::ifEmpty(null)), Field::inst("start_date") ->validator(Validate::dateFormat("Y-m-d")) ->getFormatter(Format::dateSqlToFormat("Y-m-d")) ->setFormatter(Format::dateFormatToSql("Y-m-d"))) ->process($_POST) ->json();

    Global validators

    You may also find it useful to be able to define a global validator that will execute whenever a request is made to the server and the Editor->process() method is executed. This method can be used to provide security access restrictions, validate input data as a whole or even to check that a user is logged in before processing the request.

    Function

    The function that is given to the Editor->validator() method has the following signature:

  • $editor - The Editor instance that the function is being executed for.
  • $action - The action being performed - this will be one of:
    • Editor::ACTION_READ - Read / get data
    • Editor::ACTION_CREATE - Create a new record
    • Editor::ACTION_EDIT - Edit existing data
    • Editor::ACTION_DELETE - Delete existing row(s)
    • Editor::ACTION_UPLOAD - Upload a file.
  • $data - The data submitted by the client.
  • The return value from the function should be a string if the validation fails, where the string returned is the error message to show the end user. If the validation passes, return an empty string, null or simply have no return statement.

    Note that this function is executed only once when the Editor->process() method is called, rather than once per submitted row. Also, as of Editor 1.9, it is possible to add multiple validation functions by calling Editor->validator() multiple times, just as with the field validators. The given validators will run sequentially.

    Examples // Allow read only access based on a session variable Editor::inst($db, "table") ->fields(...) ->validator(function ($editor, $action, $data) { if ($action !== Editor::ACTION_READ && $_SESSION["read_only"]) { return "Cannot modify data"; } }) ->process($_POST) ->json(); // Create and edit with dependent validation Editor::inst($db, "table") ->fields(...) ->validator(function ($editor, $action, $data) { if ($action === Editor::ACTION_CREATE || $action === Editor::ACTION_EDIT) { foreach ($data["data"] as $pkey => $values) { if ($values["country"] === "US" && $values["location"] === "London UK") { return "London UK is not in the US"; } } } }) ->process($_POST) ->json(); PHP API documentation

    The PHP API developer documentation for the Editor PHP classes is available for detailed and technical discussion about the methods and classes discussed above.

    методом 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.

    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; }

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

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


    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