过滤输入转义输出,还是转义输入过滤输出?

时间:2014-04-29 10:18:28

标签: php filter

我有一点困惑。当我在谷歌上打字时,几乎所有的文章都会提示Filter input, escape output.如果我没有混淆逃避和过滤我生命中的术语,那应该是相反的。

你会收到大量类似

的文章
$username = htmlentities(htmlspecialchars(strip_tags($_POST['username')));

并建议这样做。

  1. 我们不应过滤输入。我们应该逃避它(之前我们用mysql_real _ escape _ string来做,现在准备好的语句为我们处理它们。)我们应该将用户提交的数据插入数据库as-is,而不是使用函数更改它比如htmlspecialchars。我们应该始终将原始输入保留在数据库中,因此输入期间htmlspecialchars是错误的。 HTML对数据库无害。

  2. 我们应该过滤输出,因此恶意代码(html,js,等等)不会在浏览器上运行。这称为XSS filtering,而不是XSS escaping。例如,Laravel 4上的{{{ $var }}}被称为XSS filtering,这应始终用于用户提交的内容的输出。

  3. 如果声明Filter input escape output是正确的,为什么它不是mysql_real_filter_string()并且阻止XSS不被称为XSS escaping

    此外,ircmaxell曾说:

      

    过滤不是要防止安全漏洞,而是关于不使用垃圾填充数据库。如果您预计某个日期,请确保它至少看起来像是存储日期之前的日期。

    这称为validation,您不能仅依赖验证。 (特别是在旧版本的PHP上)您需要转义并验证输入。过滤可能不会用于安全漏洞,但转移是。

    嗯,这总结了我的困惑。有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:4)

看起来我的困惑很简单。我认为输出图层是我们开始使用echo时的图层,例如视图图层。

根据Anthony Ferrara的说法,输出是数据离开应用程序时的层,输入是数据进入应用程序时的层。

因此,Input层不仅限于用户提供的内容,而是从配置文件读取,从文件系统读取,从第三方API等检索数据都被视为{{ 1}}。

Input不限于视图图层上的Outputechoprint也计为SQL queries,因为数据会离开我们的应用程序并进入数据库的范围。因此,写入文件也算作输出,执行shell命令也算作输出。

基本上,查询数据库是output,而从数据库中检索结果是Output

当你这么想时,Input听起来是正确的。如果有人像我一样困惑,这真的很有道理。

答案 1 :(得分:3)

首先关闭:htmlentitieshtmlspecialchars实际上不会转义字符串,它们会将特定字符转换为html实体!

  1. 首先,您应该接受用户输入并删除伪/自动“安全”,如魔术引号。

    if (get_magic_quotes_gpc())
    {
        $lastname = stripslashes($_POST['lastname']);
        // ...
    }
    

    这样您就可以获得“纯粹”或原始用户输入。

  2. 然后过滤意味着不允许fooBar之类的内容作为电子邮件地址!

    if (!my_own_email_validity_check($_POST['email'])) die(); // maybe a bit extreme
    
  3. 然后转义要存储的用户输入(例如在您的数据库中)

    $city = $mysqli->real_escape_string($city);
    

    或者最好使用PDO,它“自动”地执行: - )

  4. 但真正重要的部分是在将数据从数据库显示给用户时,确保通过htmlspecialchars()全部运行,因为您无法确定那里的任何东西都是健全的!!!

  5. 现在还有其他意见认为你应该在获得原始数据时立即运行htmlentities,但这使得使用它可怕,并且不是推荐的方式。 但它甚至可能取决于你在做什么,就像有很多事情一样。

    总的来说,总结一下:

    • 存储时,您需要转义用户输入,以便您可以安全地使用
    • 显示时,您需要转换存储数据才能安全抵御XSS

    编辑:还存在很多命名差异,有时人们在转义某些内容时会将其称为过滤,或者在对某些内容进行消毒时将其称为一般转义等等。所以不要被命名困惑,只要明白发生了什么,你会没事的; - )

    编辑2: 回答您的问题:

    它被称为“过滤器输入,转义输出”,因为......

    • 在这种情况下,过滤器实际上意味着不允许数据库中存在“错误”数据。 (如第2点,电子邮件验证,邮政编码,您可以排除的事情。以后可能会破坏您数据处理的事情!)
    • 转义输出旨在防止XSS - >所以实际上转换为html实体,所以这里是一个命名
    • 的情况
    • 在“过滤器输入,转义输出”中,要么不考虑转义以防止SQL注入,要么甚至用“过滤”(这不是正确的术语(imho))进行汇总,就像你说的那样)

    在我看来,问题是,命名不一致。

答案 2 :(得分:0)

过滤输入转义输出,以防止存储不受信任,注入的错误数据,同时防止跨站点脚本(XSS)

答案 3 :(得分:0)

要查看短语最初使用的上下文,可能会有所帮助: http://shiflett.org/blog/2005/filter-input-escape-output http://shiflett.org/blog/2005/more-on-filtering-input-and-escaping-output

过滤输入并不意味着您没有通过转义来清理SQL插入。记住要谨慎,这只是一个引人入胜,简洁的最佳实践。克里斯·希弗莱特(Chris Shiflett)并未表示您永远不会逃避输入或过滤输出。