FILTER_SANITIZE_STRING做什么?
有一百万个问答来解释这样的选项,但是没有任何选择,它自己做了什么?它只是过滤标签吗?FILTER_FLAG_STRIP_LOW
FILTER_SANITIZE_STRING
有一百万个问答来解释这样的选项,但是没有任何选择,它自己做了什么?它只是过滤标签吗?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
然后,我们构建某种映射并调用 .这更有趣:它将 ASCII 代码低于 32 且高于 127 的 、 和 字符等内容转换为 HTML 实体,因此在字符串中变为 .同样,它为此使用标志。php_filter_encode_html
"
'
&
&
&
然后我们得到调用,它只是剥离HTML,XML和PHP标签(根据其定义)并删除空字节,就像注释所说的那样。php_strip_tags_ex
/ext/standard/string.c
它后面的代码用于内部字符串管理,并不真正进行任何清理。好吧,不完全是 - 如果经过清理的字符串为空,则传递未记录的标志将返回,而不是仅返回空字符串,但它并没有那么有用。例如:FILTER_FLAG_EMPTY_STRING_NULL
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
- ASCII 值低于 32 的条形字符。FILTER_FLAG_STRIP_HIGH
- ASCII 值大于 127 的条形字符。FILTER_FLAG_ENCODE_LOW
- 对 ASCII 值低于 32 的字符进行编码。FILTER_FLAG_ENCODE_HIGH
- 对 ASCII 值大于 127 的字符进行编码。FILTER_FLAG_ENCODE_AMP
- 将 & 字符编码为 (not )。&
&
FILTER_FLAG_EMPTY_STRING_NULL
- 返回而不是空字符串。NULL
我不确定“剥离标签”是否只意味着字符,以及它是否保留了标签之间的内容,例如字符串“Hello!”from ,所以我决定检查一下。以下是使用 PHP 7.1.5(以及 Bash 作为命令行)的结果:<
>
<b>Hello!</b>
curl --data-urlencode 'my-input='\ '1. ASCII b/n 32 and 127: ABC abc 012 '\ '2. ASCII higher than 127: Çüé '\ '3. PHP tag: <?php $i = 0; ?> '\ '4. HTML tag: <script type="text/javascript">var i = 0;</script> '\ '5. Ampersand: & '\ '6. Backtick: ` '\ '7. Double quote: " '\ '8. Single quote: '"'" \ 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: '
<?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: '
<?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: '
<?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: '
<?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: '
<?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: '
另外,对于FILTER_FLAG_STRIP_LOW和FILTER_FLAG_ENCODE_LOW的标志,由于我的Bash不显示这些字符,我使用铃铛字符(ASCII 007)和Restman Chrome扩展程序进行了检查: