【问题标题】:How do you prevent SQL injection in LAMP applications?如何防止 LAMP 应用程序中的 SQL 注入?
【发布时间】:2010-09-08 00:09:12
【问题描述】:

以下是开始对话的几种可能性:

  1. 在初始化时转义所有输入。
  2. 转义每个值,最好是在生成 SQL 时。

第一个解决方案不是最理想的,因为如果您想在 SQL 以外的任何地方使用每个值,例如在网页上输出,则需要取消转义每个值。

第二种解决方案更有意义,但是手动转义每个值很痛苦。

我知道prepared statements,但是我发现MySQLi 很麻烦。此外,将查询与输入分开也让我感到担忧,因为尽管正确顺序很重要,但很容易出错,从而将错误的数据写入错误的字段。

【问题讨论】:

    标签: php sql mysql lamp


    【解决方案1】:

    准备好的陈述是最好的答案。你有测试,因为你会犯错!

    请参阅this 问题。

    【讨论】:

      【解决方案2】:

      正如@Rob Walker 所说,参数化查询是您最好的选择。如果您使用的是最新最好的 PHP,我强烈建议您查看PDO(PHP 数据对象)。这是一个原生数据库抽象库,支持广泛的数据库(当然包括 MySQL)以及带有命名参数的预处理语句。

      【讨论】:

        【解决方案3】:

        我会使用准备好的语句。如果您想使用准备好的语句,您可能需要查看 PHP 的 PDO 函数。这不仅可以让您轻松运行准备好的语句,还可以通过不调用以 mysql_、mysqli_ 或 pgsql_ 开头的函数,让您与数据库无关。

        【讨论】:

          【解决方案4】:

          有一天,PDO 可能值得,但还不止于此。它是一个 DBAL,它的优势是(据说)使供应商之间的切换更容易。它并不是真正为捕获 SQL 注入而构建的。

          无论如何,您想逃避和清理您的输入,使用准备好的语句可能是一个很好的措施(我同意这一点)。尽管我相信这要容易得多,例如通过使用filter

          【讨论】:

            【解决方案5】:

            我一直使用第一种解决方案,因为在 99% 的情况下,$_GET$_POST$_COOKIE 中的变量永远不会输出到浏览器。您也永远不会错误地使用 SQL 注入编写代码(除非您不在查询中使用引号),而使用第二种解决方案,您最终可能很容易忘记转义其中一个字符串。

            实际上,我一直这样做的原因是因为我的所有网站都默认启用了 magic_quotes 设置,一旦您使用这两种解决方案之一编写了大量代码,就需要花费大量时间努力换成另一个。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-07
              • 2012-03-19
              • 2020-11-19
              • 1970-01-01
              • 2011-09-10
              相关资源
              最近更新 更多