Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php FILTER_SANITIZE_字符串的作用是什么?_Php_Sanitization - Fatal编程技术网

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标记,剥离空字节
  • FILTER\u FLAG\u NO\u ENCODE\u QUOTES
    -此标志不编码QUOTES
  • FILTER\u FLAG\u STRIP\u LOW
    -ASCII值低于32的STRIP字符
  • FILTER\u FLAG\u STRIP\u HIGH
    -ASCII值大于127的STRIP字符
  • FILTER\u FLAG\u ENCODE\u LOW
    -对ASCII值低于32的字符进行编码
  • FILTER\u FLAG\u ENCODE\u HIGH
    -对ASCII值大于127的字符进行编码
  • FILTER\u FLAG\u ENCODE\u AMP
    -将&character编码为
    &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定义不存在反斜杠呢?