Там как миллион вопросов и ответов, которые объясняют такие параметры, как 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, который: