Там как миллион вопросов и ответов, которые объясняют такие параметры, как FILTER_FLAG_STRIP_LOW
, но что делает FILTER_SANITIZE_STRING
самостоятельно, без каких-либо опций? Он просто фильтрует теги?
Согласно руководству PHP :
Разделите теги, произвольно разделите или закодируйте специальные символы.
Согласно W3Schools :
Фильтр
The FILTER_SANITIZE_STRING
или кодирует нежелательные символы.Этот фильтр удаляет данные, потенциально опасные для вашего приложения. Он используется для снятия тегов и удаления или кодирования нежелательных символов.
Теперь это не говорит нам о многом. Давайте посмотрим на некоторые источники PHP.
ext/filter/filter.c
:
static const filter_list_entry filter_list[] = { /*...*/ { "string", FILTER_SANITIZE_STRING, php_filter_string }, { "stripped", FILTER_SANITIZE_STRING, php_filter_string }, { "encoded", FILTER_SANITIZE_ENCODED, php_filter_encoded }, /*...*/
Теперь давайте посмотрим, как определяется php_filter_string
.
ext/filter/sanitizing_filters.c
:
/* {{{ php_filter_string */ void php_filter_string(PHP_INPUT_FILTER_PARAM_DECL) { size_t new_len; unsigned char enc[256] = {0}; /* strip high/strip low ( see flags )*/ php_filter_strip(value, flags); if (!(flags & FILTER_FLAG_NO_ENCODE_QUOTES)) { enc['\''] = enc['"'] = 1; } if (flags & FILTER_FLAG_ENCODE_AMP) { enc['&'] = 1; } if (flags & FILTER_FLAG_ENCODE_LOW) { memset(enc, 1, 32); } if (flags & FILTER_FLAG_ENCODE_HIGH) { memset(enc + 127, 1, sizeof(enc) - 127); } php_filter_encode_html(value, enc); /* strip tags, implicitly also removes \0 chars */ new_len = php_strip_tags_ex(Z_STRVAL_P(value), Z_STRLEN_P(value), NULL, NULL, 0, 1); Z_STRLEN_P(value) = new_len; if (new_len == 0) { zval_dtor(value); if (flags & FILTER_FLAG_EMPTY_STRING_NULL) { ZVAL_NULL(value); } else { ZVAL_EMPTY_STRING(value); } return; } }
Я пропущу комментарии флага, поскольку они уже объясняются в Интернете, как вы сказали, и сосредоточены на том, что всегда выполняется вместо этого, что не так хорошо документировано.
Сначала – php_filter_strip
. Это не делает много, просто берет флаги, которые вы передаете функции, и обрабатывает их соответственно. Это хорошо документированный материал.
Затем мы строим какое-то отображение и вызываем php_filter_encode_html
. Это более интересно: он преобразует такие вещи, как "
, '
, « &
и «символы» с кодами ASCII ниже 32 и выше, чем 127 на HTML-объекты, поэтому &
в вашей строке становится &
. Опять же, для этого используются флаги.
Затем мы вызываем вызов php_strip_tags_ex
, который просто php_strip_tags_ex
теги HTML, XML и PHP (в соответствии с его определением в /ext/standard/string.c
) и удаляет NULL байты, как говорится в комментарии.
Код, который следует за ним, используется для внутреннего управления строкой и на самом деле не выполняет никакой очистки. Ну, не совсем – передача недокументированного флага FILTER_FLAG_EMPTY_STRING_NULL
вернет NULL
если FILTER_FLAG_EMPTY_STRING_NULL
строка пуста, вместо того, чтобы возвращать только пустую строку, но это не так уж и полезно. Пример:
var_dump(filter_var("yo", FILTER_SANITIZE_STRING, FILTER_FLAG_EMPTY_STRING_NULL)); var_dump(filter_var("\0", FILTER_SANITIZE_STRING, FILTER_FLAG_EMPTY_STRING_NULL)); var_dump(filter_var("yo", FILTER_SANITIZE_STRING)); var_dump(filter_var("\0", FILTER_SANITIZE_STRING));
→
string(2) "yo" NULL string(2) "yo" string(0) ""
Происходит не так уж много, поэтому руководство было довольно правильным – подвести итог:
FILTER_FLAG_NO_ENCODE_QUOTES
– этот флаг не кодирует кавычки. FILTER_FLAG_STRIP_LOW
– FILTER_FLAG_STRIP_LOW
символы со значением ASCII ниже 32. FILTER_FLAG_STRIP_HIGH
– FILTER_FLAG_STRIP_HIGH
символы с ASCII-значением выше 127. FILTER_FLAG_ENCODE_LOW
– Кодировать символы со значением ASCII ниже 32. FILTER_FLAG_ENCODE_HIGH
– FILTER_FLAG_ENCODE_HIGH
символы с ASCII значением выше 127. FILTER_FLAG_ENCODE_AMP
– Кодировать символ &
(не &
). FILTER_FLAG_EMPTY_STRING_NULL
– возвращает NULL
вместо пустых строк. Я не был уверен, что «дескрипторы» означают только символы <
>
, и если он сохраняет контент между тегами, например, строку «Hello!» от <b>Hello!</b>
, поэтому я решил проверить. Вот результаты, используя PHP 7.1.5 (и Bash для командной строки):
curl --data-urlencode 'my-input =' \ «1. ASCII b / n 32 и 127: ABC abc 012 '\ «2. ASCII выше 127: Çüé '\ «3. PHP-тег: <? Php $ i = 0; ?> '\ «4. HTML-тег: <script type = "text / javascript"> var i = 0; </ script> '\ «5. Амперсанд: & '\ «6. Backtick: `` \ «7. Двойная цитата: "'\ «8. Одиночная цитата: '' '"\ Http: //localhost/sanitize.php
<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING);
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_BACKTICK);
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: 7. Double quote: " 8. Single quote: '
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: 7. Double quote: " 8. Single quote: '
<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH);
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
<?php echo filter_input(INPUT_POST,'my-input', FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_AMP);
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
1. ASCII b/n 32 and 127: ABC abc 012 2. ASCII higher than 127: Çüé 3. PHP tag: 4. HTML tag: var i = 0; 5. Ampersand: & 6. Backtick: ` 7. Double quote: " 8. Single quote: '
Кроме того, для флагов FILTER_FLAG_STRIP_LOW & FILTER_FLAG_ENCODE_LOW, так как мой Bash не отображает эти символы, я проверил с использованием символа колокола (, ASCII 007) и расширения Restman Chrome, который: