Очищающие фильтры
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
|
Бездействует, при необходимости удаляет или кодирует специальные символы. |
Внимание
При использовании одного из этих фильтров в качестве фильтра по умолчанию либо через ваш ini-файл,
либо через конфигурацию веб-сервера, флаги по умолчанию установлены в значение
FILTER_FLAG_NO_ENCODE_QUOTES
. Вам необходимо явно придать параметру
filter.default_flags значение 0 для наличия пустых кавычек по умолчанию. К примеру:
Пример #1 Настройка фильтра по умолчанию для работы аналогично функции htmlspecialchars
filter.default = full_special_chars
filter.default_flags = 0
Коментарии
It's not entirely clear what the LOW and HIGH ranges are. LOW is characters below 32, HIGH is those above 127, i.e. outside the ASCII range.
<?php
$a = "\tcafé\n";
//This will remove the tab and the line break
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
//This will remove the é.
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
?>
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
?>
Just to clarify, since this may be unknown for a lot of people:
ASCII characters above 127 are known as "Extended" and they represent characters such as greek letters and accented letters in latin alphabets, used in languages such as pt_BR.
A good ASCII quick reference (aside from the already mentioned Wikipedia article) can be found at: http://www.asciicodes.com/
Here is a simpler and a better presented ASCII list for the <32 or 127> filters
(if wikipedia confused the hell out of you):
http://www.danshort.com/ASCIImap/
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
?>
To include multiple flags, simply separate the flags with vertical pipe symbols.
For example, if you want to use filter_var() to sanitize $string with FILTER_SANITIZE_STRING and pass in FILTER_FLAG_STRIP_HIGH and FILTER_FLAG_STRIP_LOW, just call it like this:
$string = filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW);
The same goes for passing a flags field in an options array in the case of using callbacks.
$var = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS,
array('flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH));
Thanks to the Brain Goo blog at popmartian.com/tipsntricks/for this info.
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
None of these parameters do answer my need, so I've made my own function, hope it helps some other folks!
function removeSpecialChars($valueToClean)
{
return htmlspecialchars(str_replace([",", "#", "$", "%", "*", "~", "'", "=", "{", "[", "|", "`", "^", "]", "}", ":", ";", "<", ">", "/", "?", "&"], "", $valueToClean));
}