大约有一百万次问答,解释了诸如之类的选项FILTER_FLAG_STRIP_LOW,但是如果FILTER_SANITIZE_STRING没有任何选择,它会自己做什么呢?它只是过滤标签吗?
FILTER_FLAG_STRIP_LOW
FILTER_SANITIZE_STRING
根据PHP手册:
剥离标签,可选择剥离或编码特殊字符。
根据W3Schools:
The FILTER_SANITIZE_STRING 过滤条或编码不需要的字符。 该过滤器将删除可能对您的应用程序有害的数据。它用于剥离标签并删除或编码不需要的字符。
The FILTER_SANITIZE_STRING 过滤条或编码不需要的字符。
The FILTER_SANITIZE_STRING
该过滤器将删除可能对您的应用程序有害的数据。它用于剥离标签并删除或编码不需要的字符。
现在,这并不能告诉我们太多。我们来看一些PHP源代码。
ext/filter/filter.c:
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
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; } }
我将跳过注释标记,因为它们已经在Internet上得到了解释(如您所说),而将注意力集中在 始终 执行的内容上,而记录的内容并不多。
第一- php_filter_strip。它并没有做太多事情,只是获取传递给函数的标志并进行相应处理。它做有据可查的东西。
php_filter_strip
然后我们构造某种地图并调用php_filter_encode_html。它更有趣:它转换的东西一样",',&并与他们的ASCII码字符低于32和高于127为HTML实体,所以&在你的字符串变成&。同样,它为此使用标志。
php_filter_encode_html
"
'
&
&
然后,我们调用to php_strip_tags_ex,它只剥离HTML,XML和PHP标记(根据中的定义/ext/standard/string.c)并删除NULL字节,如注释中所述。
php_strip_tags_ex
/ext/standard/string.c
它后面的代码用于内部字符串管理,实际上并没有进行任何清理。好吧,不完全是,如果清理过的字符串为空,则传递未记录的标志FILTER_FLAG_EMPTY_STRING_NULL将返回NULL,而不是仅返回一个空字符串,但这并不是那么有用。一个例子:
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_HIGH
FILTER_FLAG_ENCODE_LOW
FILTER_FLAG_ENCODE_HIGH
FILTER_FLAG_ENCODE_AMP
&