当前位置: 首页 > 面试题库 >

FILTER_SANITIZE_STRING是做什么的?

金钧
2023-03-14
问题内容

大约有一百万次问答,解释了诸如之类的选项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;
    }
}

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

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

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

然后,我们调用to
php_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) ""

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

  • 始终:剥离HTML,XML和PHP标记,剥离NULL字节。
  • 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-将&字符编码为&(不是&)。
  • FILTER_FLAG_EMPTY_STRING_NULL-返回NULL而不是空字符串。


 类似资料:
  • JavaDoc说: 我知道 C# 中的 是什么,但这个标量和 C# 标量似乎完全不同。

  • 本文向大家介绍eval是做什么的?相关面试题,主要包含被问及eval是做什么的?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 它的功能是将对应的字符串解析成js并执行,应该避免使用js,因为非常消耗性能(2次,一次解析成js,一次执行)

  • 问题内容: 有时我会创建一个函数,稍后再调用该函数。 例: 不知何故,某些功能无法调用。我必须在内部调用这些函数: 做什么和意味着,什么是这些区别/目的是什么? 问题答案: 只是jQuery的简写 它的设计目的(除其他事项外)是确保一旦页面的所有DOM元素准备就绪即可使用您的函数。 但是,我不认为这是您遇到的问题-您能否弄清楚“以某种方式,某些函数无法调用,而我必须在内部调用这些函数”的意思吗?也

  • 我一直在努力学习什么是EJB bean,这意味着他们的实例在池中被管理,等等。真的不能很好地掌握它们。 你能给我解释一下它们到底是什么吗(实际上对于一个Java程序员来说)?他们是做什么的?他们的目的是什么?为什么要真正使用它们?(为什么不坚持?)也许是一个示例应用程序? 请仅参考更新的信息,即。关于EJB的过时信息可能具有误导性。 对于EJB学习初学者,请注意: EJB基于分布式对象,这是指运行

  • 问题内容: 在对另一个问题的答案发表评论时,有人说他们不确定自己在做什么。所以,我问这个问题,以便在上有它的记录,以备将来参考:到底是做什么的? 问题答案: 使用装饰器时,你将一个功能替换为另一个。换句话说,如果你有一个装饰器 然后当你说 并且你的函数f将替换为。不幸的是,这意味着如果你然后说 它会打印出来,因为那是新功能的名称。实际上,如果你查看的文档字符串f,则将为空,因为没有文档字符串,因此

  • 问题内容: 我遵循了以下教程:http : //davidtsadler.com/archives/2012/06/03/how-to-install- magento-on-ubuntu/ 在某个时候,它告诉我执行以下命令: 这个命令做了什么,我该如何取消呢? 我重新启动了计算机,看来它仍在运行。我看了看和,但没有在里面找到它。 问题答案: 引用自: 您引用的命令会将heredoc中的文本(即,