Очищающие фильтры
ID | Имя | Параметры | Флаги | Описание |
---|---|---|---|---|
FILTER_SANITIZE_EMAIL |
"email" | Удаляет все символы, кроме букв, цифр и !#$%&'*+-/=?^_`{|}~@.[]. | ||
FILTER_SANITIZE_ENCODED |
"encoded" |
FILTER_FLAG_STRIP_LOW ,
FILTER_FLAG_STRIP_HIGH ,
FILTER_FLAG_ENCODE_LOW ,
FILTER_FLAG_ENCODE_HIGH
|
Кодирует строку в формат URL, при необходимости удаляет или кодирует специальные символы. | |
FILTER_SANITIZE_MAGIC_QUOTES |
"magic_quotes" | Применяется функция addslashes(). | ||
FILTER_SANITIZE_NUMBER_FLOAT |
"number_float" |
FILTER_FLAG_ALLOW_FRACTION ,
FILTER_FLAG_ALLOW_THOUSAND ,
FILTER_FLAG_ALLOW_SCIENTIFIC
|
Удаляет все символы, кроме цифр, +- и, при необходимости, .,eE. | |
FILTER_SANITIZE_NUMBER_INT |
"number_int" | Удаляет все символы, кроме цифр и знаков плюса и минуса. | ||
FILTER_SANITIZE_SPECIAL_CHARS |
"special_chars" |
FILTER_FLAG_STRIP_LOW ,
FILTER_FLAG_STRIP_HIGH ,
FILTER_FLAG_ENCODE_HIGH
|
Экранирует HTML-символы '"<>& и символы с ASCII-кодом, меньшим 32, при необходимости удаляет или кодирует остальные специальные символы. | |
FILTER_SANITIZE_FULL_SPECIAL_CHARS |
"full_special_chars" |
FILTER_FLAG_NO_ENCODE_QUOTES ,
|
Эквивалентно вызову htmlspecialchars() с установленным параметром ENT_QUOTES .
Кодирование кавычек может быть отключено с помощью установки флага FILTER_FLAG_NO_ENCODE_QUOTES .
Аналогично htmlspecialchars(), этот фильтр
принимает во внимание default_charset
и, если будет обнаружена некорректная последовательность байт
для данной кодировки, то вся строка будет признана негодной и
и результатом будет строка нулевой длины.
При использовании этого фильтра в качестве фильтра по умолчанию, ознакомьтесь с предупреждением ниже об установке флагов по умолчанию в 0.
|
|
FILTER_SANITIZE_STRING |
"string" |
FILTER_FLAG_NO_ENCODE_QUOTES ,
FILTER_FLAG_STRIP_LOW ,
FILTER_FLAG_STRIP_HIGH ,
FILTER_FLAG_ENCODE_LOW ,
FILTER_FLAG_ENCODE_HIGH ,
FILTER_FLAG_ENCODE_AMP
|
Удаляет тэги, при необходимости удаляет или кодирует специальные символы. | |
FILTER_SANITIZE_STRIPPED |
"stripped" | Псевдоним фильтра "string". | ||
FILTER_SANITIZE_URL |
"url" | Удаляет все символы, кроме букв, цифр и $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=. | ||
FILTER_UNSAFE_RAW |
"unsafe_raw" |
FILTER_FLAG_STRIP_LOW ,
FILTER_FLAG_STRIP_HIGH ,
FILTER_FLAG_ENCODE_LOW ,
FILTER_FLAG_ENCODE_HIGH ,
FILTER_FLAG_ENCODE_AMP
|
Бездействует, при необходимости удаляет или кодирует специальные символы. Этот фильтр
также равнозначен константе FILTER_DEFAULT .
|
Внимание
При использовании одного из этих фильтров в качестве фильтра по умолчанию либо через ваш ini-файл,
либо через конфигурацию веб-сервера, флаги по умолчанию установлены в значение
FILTER_FLAG_NO_ENCODE_QUOTES
. Вам необходимо явно придать параметру
filter.default_flags значение 0 для наличия пустых кавычек по умолчанию. К примеру:
Пример #1 Настройка фильтра по умолчанию для работы аналогично функции htmlspecialchars
filter.default = full_special_chars
filter.default_flags = 0
Коментарии
Remember to trim() the $_POST before your filters are applied:
<?php
// We trim the $_POST data before any spaces get encoded to "%20"
// Trim array values using this function "trim_value"
function trim_value(&$value)
{
$value = trim($value); // this removes whitespace and related characters from the beginning and end of the string
}
array_filter($_POST, 'trim_value'); // the data in $_POST is trimmed
$postfilter = // set up the filters to be used with the trimmed post array
array(
'user_tasks' => array('filter' => FILTER_SANITIZE_STRING, 'flags' => !FILTER_FLAG_STRIP_LOW), // removes tags. formatting code is encoded -- add nl2br() when displaying
'username' => array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW), // we are using this in the url
'mod_title' => array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW), // we are using this in the url
);
$revised_post_array = filter_var_array($_POST, $postfilter); // must be referenced via a variable which is now an array that takes the place of $_POST[]
echo (nl2br($revised_post_array['user_tasks'])); //-- use nl2br() upon output like so, for the ['user_tasks'] array value so that the newlines are formatted, since this is our HTML <textarea> field and we want to maintain newlines
?>
FILTER_SANITIZE_STRING doesn't behavior the same as strip_tags function. strip_tags allows less than symbol inferred from context, FILTER_SANITIZE_STRING strips regardless.
<?php
$smaller = "not a tag < 5";
echo strip_tags($smaller); // -> not a tag < 5
echo filter_var ( $smaller, FILTER_SANITIZE_STRING); // -> not a tag
?>
Please be aware that when using filter_var() with FILTER_SANITIZE_NUMBER_FLOAT and FILTER_SANITIZE_NUMBER_INT the result will be a string, even if the input value is actually a float or an int.
Use FILTER_VALIDATE_FLOAT and FILTER_VALIDATE_INT, which will convert the result to the expected type.
Although it's specifically mentioned in the above documentation, because many seem to find this unintuitive it's worth pointing out that FILTER_SANITIZE_NUMBER_FLOAT will remove the decimal character unless you specify FILTER_FLAG_ALLOW_FRACTION:
<?php
$number_string = '12.34';
echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT ); // 1234
echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); // 12.34
?>
With the deprecation of FILTER_SANITIZE_STRING, the "use htmlspecialchars instead" is an incomplete comment. The functionality of FILTER_SANITIZE_STRING was a combination of htmlspcialchars and (approximately) strip_tags. For true compatibility a polyfil may be needed:
<?php
function filter_string_polyfill(string $string): string
{
$str = preg_replace('/\x00|<[^>]*>?/', '', $string);
return str_replace(["'", '"'], [''', '"'], $str);
}
$string = "Some \"' <bizzare> string & to Sanitize < !$@%";
echo filter_var($string,FILTER_SANITIZE_STRING).PHP_EOL;
//Some "' string & to Sanitize
echo htmlspecialchars($string).PHP_EOL;
//Some "' <bizzare> string & to Sanitize < !$@%
echo strip_tags($string).PHP_EOL;
//Some "' string & to Sanitize < !$@%
echo htmlspecialchars(strip_tags($string,ENT_QUOTES)).PHP_EOL;
//Some "' string & to Sanitize < !$@%
echo filter_string_polyfill($string).PHP_EOL;
//Some "' string & to Sanitize