---
title: "PHP → Фильтрация входных данных в PHP"
description: "Фильтрация входных данных — одна из самых важных вещей, которой надо уделять внимание при разработке..."
author: "dastan_myrza"
published: "2009-09-21T22:12:45+00:00"
modified: "2009-09-21T22:12:45+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/php-filtraciya-vhodnyh-dannyh-v-php-18505"
markdown_url: "https://yvision.kz/post/php-filtraciya-vhodnyh-dannyh-v-php-18505/markdown"
site_name: "Yvision.kz"
---

# PHP → Фильтрация входных данных в PHP

> Фильтрация входных данных — одна из самых важных вещей, которой надо уделять внимание при разработке...

Фильтрация входных данных — одна из самых важных вещей, которой надо уделять внимание при разработке веб-сайта. Опытным программистам это известно, а новички пусть запомнят одну очень важную вещь: **Данным, полученным от пользователя, доверять нельзя.** Что это значит? А это значит то, что если нам нужно, чтобы пользователь ввел число, это совсем не означает, что он введет именно число. Он может ввести **что угодно**. И поэтому нам необходимо проверить корректность введенных пользователем данных и оградить себя от возможных вследствие этого ошибок и улучшить безопасность наших скриптов. Обычно для этого пользуются регулярными выражениями, но начиная с версии 5.2.0, в PHP есть специальные функции, которые выполняют эту работу.

## Введение Как было отмечено выше, начиная с версии 5.2.0 в PHP присутствуют специальные функции для фильтрации данных. Одна из таких функций - `filter_var`. Сначала нам необходимо убедиться, что нужные нам функции установлены и доступны. Для этого напишем простенький скрипт:
- if (function_exists('filter_list')) - { - echo 'список фильтров установлен!'; - } else { - die('Ошибка: фильтры не найдены.'); - }

```
if (function_exists('filter_list')){ echo 'список фильтров установлен!';} else { die('Ошибка: фильтры не найдены.');}
```

Если все в порядке и функции фильтров установлены, давайте продолжим. Взглянем на список установленных фильтров. Получить список фильтров можно уже известной нам функцией `filter_list`:
- echo " \n"; - $filters = filter_list();
- foreach ($filters as $filter) - { - echo "".$filter."\n"; - } - echo " \n";

```
echo "
```

- \n"; $filters = filter_list(); foreach ($filters as $filter) { echo "

- ".$filter."

- \n"; } echo "

```
\n";
```

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

## Три способа фильтрации данных

Существует три основных способа фильтрации входных данных:
- **Validate (проверка)** — позволяет проверить и убедиться в том, что введенные данные действительно являются тем, что ожидается. Флаги проверки имеют префикс **FILTER_VALIDATE_**

- **Sanitize (очистка)** — “Очищает” входящие данные. Убирает, экранирует или кодирует недозволенные символы. Флаги очистки начинаются с **FILTER_SANITIZE_**

- **Flags (флаги)** — с помощью флагов вы можете задавать различные варианты поведения фильтров. Флаги бывают как общими для всех фильтров, так и специфические флаги для конкретных фильтров. Обычно они начинаются с **FILTER_FLAG_**

## filter_var($var, FLAG[, FLAGS])

Функция **filter_var()** принимает как минимум два параметра — имя переменной, которую вы собираетесь фильтровать и флаг. Давайте начнем с примера, который очень часто требуется: валидация (проверка) корректности e-mail адреса. Для этого мы будем использовать функцию **filter_var()** и флаг **FILTER_VALIDATE_EMAIL**.

- $email = 'fgdjkdgdfghdsdfj'; - $vaild_email = filter_var($email, FILTER_VALIDATE_EMAIL);

```
$email = 'fgdjkdgdfghdsdfj';$vaild_email = filter_var($email, FILTER_VALIDATE_EMAIL);
```

Результат работы этой функции имеет логический тип(**bool**) и принимает значение **true** если строка успешно прошла через фильтр, и **false** в обратном случае:
- if ($valid_email !== false) - { - echo "E-mail адрес корректный"; - } else { - echo "Некорректный E-mail адрес"; - }

```
if ($valid_email !== false){ echo "E-mail адрес корректный";} else { echo "Некорректный E-mail адрес";}
```

Так как **fgdjkdgdfghdsdfj** — это, конечно же, некорректный e-mail адрес, то фильтр вернет **false**. Все очень просто, не так ли? Всего лишь вызов одной функции вместо громоздкого регулярного выражения.

## Константы фильтров (флаги)

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

- $int = 432; - $bool = true; - $float = 432.43; - $reg = "/^([a-zA-Z0-9 ]){4,16}$/"; - $url = "http://devolio.com/blog"; - $email = 'joey@devolio.com'; - $ipaddr = '127.0.0.1'; - $ipres = "192.168.0.*"; - $ipv6addr = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334"; - $string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234 567890`~!@#$%^&*()-_=+[{]};:'\".?/|\\n\\r\\t"; - $int_octal = decoct(800.82); - $int_hex = dechex(800.82);

```
$int = 432;$bool = true;$float = 432.43;$reg = "/^([a-zA-Z0-9 ]){4,16}$/";$url = "http://devolio.com/blog";$email = 'joey@devolio.com';$ipaddr = '127.0.0.1';$ipres = "192.168.0.*";$ipv6addr = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";$string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234 567890`~!@#$%^&*()-_=+[{]};:'\".?/|\\n\\r\\t";$int_octal = decoct(800.82);$int_hex = dechex(800.82);
```

*Также обратите внимание, что переменная **$string** содержит символы табуляции и переносы строк, для того чтобы лучше было видно что именно фильтруется.*

Ниже представлены константы фильтров, которые мы будем использовть. Кстати говоря, это не все фильтры, которые существуют.

## Проверка типа переменной и валидация*

* Валидация дает уверенность в том, что вы получите именно то что надо, или вообще ничего.

**FILTER_VALIDATE_INT** — проверка на целое число.

- $valid_int = filter_var($int, FILTER_VALIDATE_INT);
- if ($valid_int !== false) - { - // проверка прошла успешно, $valid_int — целое число - } else { - // проверка не прошла - }

```
$valid_int = filter_var($int, FILTER_VALIDATE_INT);if ($valid_int !== false){ // проверка прошла успешно, $valid_int — целое число} else { // проверка не прошла}
```

**FILTER_VALIDATE_FLOAT** — проверка на число с плавающей точкой

**FILTER_VALIDATE_BOOLEAN** — проверка на булево число

**FILTER_VALIDATE_URL** — проверка на URL-адрес

**FILTER_VALIDATE_EMAIL** — уже знакомая нам проверка e-mail адреса

**FILTER_VALIDATE_IP** — проверка IP-адреса

**FILTER_UNSAFE_RAW** — проверка на небезопасный, "сырой" текст.

## Очистка данных

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

**FILTER_SANITIZE_STRING** — базовая очистка строки. Удаляет символы <>?

- $san_string = filter_var($string, FILTER_SANITIZE_STRING);

```
$san_string = filter_var($string, FILTER_SANITIZE_STRING);
```

**FILTER_SANITIZE_STRIPPED** — базовая очистка строки. Удаляет символы <>?

**FILTER_SANITIZE_ENCODED** — кодирует символы `~!@#$%^&*()=+[{]};:'".?/| в %hex

**FILTER_SANITIZE_SPECIAL_CHARS** — кодирует специальные символы <>&" в &type;

**FILTER_SANITIZE_EMAIL** — убирает символы <>();:,\”

**FILTER_SANITIZE_URL** — оставляет только a-zA-Z0-9`~!@#$%^&*()-_=+[{]};:'".?/|

**FILTER_SANITIZE_NUMBER_INT** — оставляет только 1234567890-+

**FILTER_SANITIZE_NUMBER_FLOAT** — оставляет только 1234567890-+.

**FILTER_SANITIZE_MAGIC_QUOTES** — кодирует '”\, точно так же как и **magic quotes**

# Флаги

Флаги — это дополнительные параметры фильтров. Большинство флагов предназначено для конкретных режимов проверки/очистки.

**FILTER_FLAG_ALLOW_OCTAL** (только для фильтров *_INT) — разрешает восьмеричные цифры для фильтров *_INT.

- $allow_octal = filter_var($int_octal, FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_ALLOW_OCTAL);

```
$allow_octal = filter_var($int_octal, FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_ALLOW_OCTAL);
```

**FILTER_FLAG_ALLOW_HEX** (*_INT filters only) — разрешает шестнадцатиричные цифры для фильтров *_INT.

**FILTER_FLAG_STRIP_LOW** — вырезает все символы, код которых меньше 32 (ASCII)

**FILTER_FLAG_STRIP_HIGH** — вырезает все символы с кодами больше 127 (ASCII)

**FILTER_FLAG_ENCODE_LOW** — кодирует все символы, код которых меньше 32 (ASCII)

**FILTER_FLAG_ENCODE_HIGH** — кодирует все символы с кодами больше 127 (ASCII)

**FILTER_FLAG_NO_ENCODE_QUOTES** — игнорирует символы ' и "

**FILTER_FLAG_ALLOW_FRACTION** (только для фильтров *_NUMBER_FLOAT) — разрешает только 1234567890-+.

**FILTER_FLAG_ALLOW_THOUSAND** (только для фильтров *_NUMBER_FLOAT) — разрешает только 1234567890-+,

**FILTER_FLAG_ALLOW_SCIENTIFIC** (только для фильтров *_NUMBER_FLOAT) — разрешает только eE1234567890-+

**FILTER_FLAG_SCHEME_REQUIRED** (только для VALIDATE_URL) — требует присутствия схемы URL (http://, ftp:// и т.д.)

**FILTER_FLAG_HOST_REQUIRED** (только для VALIDATE_URL) — требует присутствия URL-хоста

**FILTER_FLAG_PATH_REQUIRED** (только для VALIDATE_URL) — требует присутствия URL-пути

**FILTER_FLAG_QUERY_REQUIRED** (только для VALIDATE_URL) — требует присутствия URL строки запроса

**FILTER_FLAG_IPV4** (только для VALIDATE_IP) — требует, чтобы IP-адрес был в формате IPV4

**FILTER_FLAG_IPV6** (только для VALIDATE_IP) — требует, чтобы IP-адрес был в формате IPV6

**FILTER_FLAG_NO_RES_RANGE** (только для VALIDATE_IP) — требует, чтобы IP-адрес не был в диапазоне зарезервированных адресов

**FILTER_FLAG_NO_PRIV_RANGE** (только для VALIDATE_IP) — требует, чтобы IP-адрес не был в диапазоне локальных адресов

**FILTER_NULL_ON_FAILURE** — Возвращает **null** вместо пустой строки, если не проходит проверка или какой-нибудь флаг

[оригинал](http://devolio.com/blog/archives/413-Data-Filtering-Using-PHPs-Filter-Functions-Part-one.html)

---

Source: [https://yvision.kz/post/php-filtraciya-vhodnyh-dannyh-v-php-18505](https://yvision.kz/post/php-filtraciya-vhodnyh-dannyh-v-php-18505)