Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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 何时使用过滤器_输入()_Php_Security - Fatal编程技术网

Php 何时使用过滤器_输入()

Php 何时使用过滤器_输入(),php,security,Php,Security,这个问题最初是在评论中提出的 如果使用参数化查询,在打印任何用户提供的数据之前,是否仍然需要 对我来说似乎没有必要,但我总是被告知“过滤输入,转义输出”。那么,除了数据库(或其他形式的存储)之外,是否还需要过滤输入的数据 嗯,会有不同的意见 我的看法是,您应该始终使用它(或者通常使用过滤器扩展)。这至少有三个原因: 清理输入是您应该经常做的事情。由于该函数提供了此功能,因此没有理由寻找其他方法来清理输入。因为它是一个扩展,所以过滤器也会比大多数PHP解决方案更快、更安全,这当然不会造成伤害。唯一

这个问题最初是在评论中提出的

如果使用参数化查询,在打印任何用户提供的数据之前,是否仍然需要


对我来说似乎没有必要,但我总是被告知“过滤输入,转义输出”。那么,除了数据库(或其他形式的存储)之外,是否还需要过滤输入的数据

嗯,会有不同的意见

我的看法是,您应该始终使用它(或者通常使用
过滤器
扩展)。这至少有三个原因:

  • 清理输入是您应该经常做的事情。由于该函数提供了此功能,因此没有理由寻找其他方法来清理输入。因为它是一个扩展,所以过滤器也会比大多数PHP解决方案更快、更安全,这当然不会造成伤害。唯一的例外是,如果您需要更专门的过滤器。即使这样,您也应该使用
    FILTER\u UNSAFE\u RAW
    FILTER(请参见#3)获取该值

  • filter
    扩展中有很多好东西。它可以节省您编写消毒和验证代码的时间。当然,它并没有涵盖每一种情况,但有足够的内容可以让您更加关注特定的筛选/验证代码

  • 在调试/审核代码时,使用该函数非常有用。当使用该函数时,您确切地知道输入将是什么。例如,如果您使用
    过滤器\u SANITIZE\u NUMBER\u INT
    过滤器,那么您可以确保输入将是一个数字——没有SQL注入,没有HTML或Javascript代码等。另一方面,如果您使用
    过滤器\u UNSAFE\u RAW
    之类的东西,那么您知道应该谨慎对待它,而且很容易造成安全问题


  • 正如斯维里·M·奥尔森所说,在这方面存在着不同的意见

    我非常同意过滤输入、转义输出的原理

    如果在打印任何用户提供的数据之前使用参数化查询和htmlspecialchars(),是否仍然需要filter_input()

    简短回答:IMO,没有。这不是必需的,但在某些情况下可能有用


    filter\u input
    函数有许多有用的过滤器,我确实使用了其中一些过滤器(即filter\u VALIDATE\u EMAIL)。这些参数对于验证输入非常有用。然而,依我看,转换数据的那些应该只用于输出

    有些人鼓励逃避输入。事实上,手册页上给出的例子似乎也鼓励了这一点

    $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
    $search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
    
    唯一的例子就是逃跑。结合函数名(filterinput)似乎表明转义输入是一种好的做法。转义是必要的,但依我看,应该在输出之前进行,而不是在输入时。至少返回值存储在适当命名的变量中

    我强烈反对转义输入。我已经遇到过现实世界中过早转换数据是一个问题的情况

    例如,Google Analytics处理输入的方式会导致我的编码符号(%26)在排除查询参数之前被解码。结果是,我的URL中甚至不存在查询参数的统计信息。请参阅关于这个尚未解决的问题

    你可能还想读书。以下是我同意的一些摘录,以防文章消失[原文的重点]

    […]输入时转义是错误的[…]这是一种分层冲突-它将输出格式问题与输入处理混为一谈。分层冲突使您的代码更难理解和维护,因为您必须考虑其他层,而不是让每个组件和层完成自己的工作

    默认情况下,您已损坏数据。系统[…]现在对数据的来源撒谎

    对输入进行转义不仅无法处理多个输出的问题,实际上还会使许多输出的数据不正确

    PHP过去有一个名为magic quotes的功能。这是一种输入逃逸特性,[…]导致了各种各样的问题。[…]根据Lerdorf的说法,更新得多的PHP“过滤器”扩展是“magic_quotes done right”。但它仍然受到这里描述的几乎所有问题的困扰

    那么,过滤器扩展如何比魔术引号更好(除了它有许多不同的过滤器这一事实)过滤器导致的问题与magic quotes相同。


    以下是我使用的编码约定:

    • $\u POST、$\u GET、$\u REQUEST等中的值不应转义,应始终视为不安全
    • 在将值写入数据库或存储在$\u会话中之前,应先验证1
    • 预期为数字或布尔值的值在写入数据库或存储在$\u会话中之前应经过清理2
    • 请相信数据库和$\u会话中的数值和布尔值确实是数值或布尔值
    • 字符串值应在直接用于任何SQL查询(非字符串值应经过清理2)或使用准备好的语句之前进行SQL转义
    • 字符串值应在HTML输出中使用之前进行HTML转义(非字符串值应经过清理2)
    • 字符串值在用于查询字符串之前应进行百分比编码(非字符串值应进行清理2)
    • 使用变量命名约定(例如*\uURL、*\uHTML、*\uSQL)存储转换后的数据
    术语

    就我在这里的目的而言,这是我如何定义上述术语的

  • 验证是指确认对数据所做的任何假设,例如具有特定格式或所需字段hav