您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

FILTER_SANITIZE_STRING是做什么的?

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;
    }
}

我将跳过注释标记,因为它们已经在Internet上得到了解释(如您所说),而将注意力集中在 始终 执行的内容上,而记录的内容并不多。

第一- PHP_filter_strip。它并没有做太多事情,只是获取传递给函数的标志并进行相应处理。它做有据可查的东西。

然后我们构造某种地图并调用PHP_filter_encode_html。它更有趣:它转换的东西一样"'&并与他们的ASCII码字符低于32和高于127为HTML实体,所以&在你的字符串变成&。同样,它为此使用标志。

然后,我们调用toPHP_strip_tags_ex,它只剥离HTML,XML和PHP标记(根据中的定义/ext/standard/string.c)并删除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) ""

没有更多的事情要做,因此手册是相当正确的-总结一下:

其他 2022/1/1 18:17:35 有450人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶