【问题标题】:How to properly filter input from users in PHP?如何在 PHP 中正确过滤来自用户的输入?
【发布时间】:2011-02-23 15:53:33
【问题描述】:

过滤来自用户的输入(POST 和 GET)以避免 SQL 注入和类似性质的事情的行业标准是什么。到目前为止,我正在使用 filter_input() 和 mysql_real_escape_string() 函数?够不够,如果不够,我应该使用什么其他方法?

【问题讨论】:

  • 对我来说似乎不错,只是不要忘记验证/清理任何内容。我唯一不同的是使用 PDO 而不是 mysql_*。在某种程度上,您不太可能让某些事情溜走,因为您在 PDO 中为 SQL 查询赋值的方式会强制进行清理。
  • @erisco 您能否详细说明 PDO 以及您如何处理它?
  • 我可能可以,但php.net/manual/en/pdostatement.execute.php 已经有很好的例子了。 PDO 已非正式地成为 PHP 中数据库访问的标准。
  • 你可以用mysqli代替mysql。这样,您就可以访问准备好的语句。

标签: php security filtering sql-injection sanitize


【解决方案1】:

生活的一个重要规则是FIEO。过滤输入转义输出。

您从用户那里获取和存储的任何信息都必须在服务器端进行过滤,为此您应该使用mysql_real_escape_string。在将值添加到数据库之前,它始终应该是您应该做的最后一件事。验证用户输入,确保它是你想要的,如果你需要使用正则表达式,删除任何符号或标签,检查它的长度和任何其他规则 - 完成所有这些,然后最后应用 MySQL 函数mysql_real_escape_string

您在网页上显示的任何动态信息(即来自用户生成内容的数据库或直接来自用户输入)都必须进行转义。您必须对任何符号进行 URL 编码,删除(或编码)任何 HTML 标记。

我强烈建议您观看专家 Chris Shiflett 的网络安全演示:

http://www.slideshare.net/shiflett/evolution-of-web-security

【讨论】:

    【解决方案2】:

    转义以避免 SQL 注入和过滤验证输入是两件不同的事情。您不需要过滤输入来避免 SQL 注入,过滤输入不一定有助于防止 SQL 注入。

    为避免 SQL 注入,您需要对输入进行转义,以免弄乱您的查询语法,或者您使用准备好的语句来完全避免该问题。这个输入包含什么,不管它是否被过滤,都无关紧要。如果您为数据库使用适当的转义函数或使用准备好的语句将其转义一次,那么您就不必担心 SQL 注入了。

    您出于不同的原因过滤或验证输入,主要是因为您不想在数据库中允许某些值。这与将这些值放入数据库(可能发生 SQL 注入的地方)的方式完全不同。

    输出 上,您还需要根据输出介质对值进行转义,原因与将它们放入 SQL 查询时转义它们的原因相同:避免弄乱语法,这可能是被剥削。 IE。输出到网页时,您的 HTML 会转义您的值。同样,它的价值是什么并不重要。如果它被正确地转义,它可以是任何东西。

    【讨论】:

      【解决方案3】:

      我建议你使用数据库库将数据保存到数据库,如 pear db 或 cakephp orm

      在这种方法中你确实注意到可以攻击你的数据库进行注入

      【讨论】:

        【解决方案4】:

        您可以在 php.ini 中使用 PDO 进行数据库连接。 PDO 代表 PHP 数据对象。它比 mysql_connect 更好。 PDO 是面向 Objetc 的,它也确保了更多的保护。

        http://www.php.net/manual/en/class.pdo.php

        $link = new PDO ( $dsn, $user, $password, $options ) ;
        

        【讨论】:

          【解决方案5】:

          使用htmlspecialchars 对可能导致问题的字符进行编码。验证数据是不同的,这取决于您对输入字段的期望。

          【讨论】:

            猜你喜欢
            • 2012-03-09
            • 1970-01-01
            • 2010-11-05
            • 2016-06-18
            • 1970-01-01
            • 2013-01-14
            • 1970-01-01
            • 2011-01-21
            • 2019-11-09
            相关资源
            最近更新 更多