Php FILTER_SANITIZE_字符串的作用是什么?
有无数的问答解释了像Php FILTER_SANITIZE_字符串的作用是什么?,php,sanitization,Php,Sanitization,有无数的问答解释了像FILTER\u FLAG\u STRIP\u LOW这样的选项,但是FILTER\u SANITIZE\u STRING在没有任何选项的情况下自己做什么呢?它只是过滤标签吗?根据: 带标签,可选带或编码特殊字符 根据: FILTER\u SANITIZE\u字符串过滤条带或编码不需要的字符 此筛选器删除对应用程序可能有害的数据。它用于去除标签和删除或编码不需要的字符 现在,这并没有告诉我们多少。让我们来看一些PHP源代码 ext/filter/filter.c: stati
FILTER\u FLAG\u STRIP\u LOW
这样的选项,但是FILTER\u SANITIZE\u STRING
在没有任何选项的情况下自己做什么呢?它只是过滤标签吗?根据:
带标签,可选带或编码特殊字符
根据:
FILTER\u SANITIZE\u字符串
过滤条带或编码不需要的字符
此筛选器删除对应用程序可能有害的数据。它用于去除标签和删除或编码不需要的字符
现在,这并没有告诉我们多少。让我们来看一些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 */
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\u filter\u string
。ext/filter/sanitizing_filters.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 */
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\u过滤器\u条
。它并没有做太多的工作,只是获取传递给函数的标志并相应地处理它们。它做的是有据可查的事情
然后我们构造某种映射并调用php\u filter\u encode\u html
。更有趣的是:它将诸如“
,”
,&
和字符(其ASCII代码低于32且高于127)之类的内容转换为HTML实体,因此字符串中的&
变为&;
。同样,它使用标志进行转换
然后调用php\u strip\u tags\u ex
,它只剥离HTML、XML和php标记(根据/ext/standard/string.c
中的定义),并删除空字节,如注释所示
它后面的代码用于内部字符串管理,并不真正执行任何清理。嗯,不完全是这样的-如果清理后的字符串为空,则传递未记录的标志FILTER\u flag\u EMPTY\u string\u 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));
→
没有更多的事情发生,所以手册是相当正确的-总结起来:
- 始终:剥离HTML、XML和PHP标记,剥离空字节
-此标志不编码QUOTESFILTER\u FLAG\u NO\u ENCODE\u QUOTES
-ASCII值低于32的STRIP字符FILTER\u FLAG\u STRIP\u LOW
-ASCII值大于127的STRIP字符FILTER\u FLAG\u STRIP\u HIGH
-对ASCII值低于32的字符进行编码FILTER\u FLAG\u ENCODE\u LOW
-对ASCII值大于127的字符进行编码FILTER\u FLAG\u ENCODE\u HIGH
-将&character编码为FILTER\u FLAG\u ENCODE\u AMP
(非&38;
)&;
-返回FILTER\u FLAG\u EMPTY\u STRING\u NULL
,而不是空字符串NULL
字符,以及它是否保留标签之间的内容,例如字符串“Hello!“来自Hello!
,因此我决定进行检查。以下是使用PHP7.1.5(命令行为Bash)得到的结果:
curl--data urlencode'my input='\
'1.ASCII b/n 32和127:ABC 012'\
'2.ASCII高于127:Chcué'\
'3.PHP标记:'\
'4.HTML标记:var i=0;'\
“5.符号:&”\
“6.背勾:`”\
‘7.双引号:’\
“8.单引号:”“\
http://localhost/sanitize.php
- sanitize.php:
我想说,用HTML工具处理纯文本和途中损坏的用户输入是php的另一项功能。FILTER\u sanitize\u字符串的可能副本是剥离<字符和任何文本。通常,W3School的定义是完全无用的。如果不定义“不需要的字符”是什么,这实际上可以根据它们做任何事情。更常见的是,官方的PHP.net定义不存在反斜杠呢?