代码之家  ›  专栏  ›  技术社区  ›  Ben

如何在LAMP应用程序中防止SQL注入?

  •  7
  • Ben  · 技术社区  · 17 年前

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

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

    第一个解决方案是次优的,因为如果您想在除SQL以外的任何地方使用每个值,比如在网页上输出它,那么就需要取消对每个值的scape。

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

    我知道 prepared statements 但是我发现 MySQLi 麻烦。另外,将查询与输入分离也让我担心,因为尽管正确地获取订单很重要,但很容易出错,从而将错误的数据写入错误的字段。

    5 回复  |  直到 13 年前
        1
  •  7
  •   pix0r    17 年前

    正如@rob walker所说,参数化查询是最好的选择。如果您使用的是最新最好的PHP,我强烈建议您看看 PDO (PHP数据对象)。这是一个本地数据库抽象库,它支持各种数据库(当然包括MySQL)以及带有命名参数的准备语句。

        2
  •  10
  •   Community Mohan Dere    9 年前

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

    this 问题。

        3
  •  1
  •   Kibbee    17 年前

    我会使用准备好的语句。如果您想要使用准备好的语句,那么您可能想要检查PHP的PDO函数。这不仅使您能够轻松地运行准备好的语句,而且通过不调用以mysql、mysqli或pgsql开头的函数,使您更加不依赖数据库。

        4
  •  0
  •   Till    17 年前

    PDO也许有朝一日值得,但现在还不只是这样。它是一个dbal,它的优势(据说)是使供应商之间的切换更加容易。它不是真正构建来捕获SQL注入的。

    不管怎样,您希望避免输入并对其进行卫生处理,使用准备好的语句可能是一个很好的措施(我同意这一点)。尽管我相信这很容易,例如利用 filter .

        5
  •  -1
  •   Linus Caldwell Emperor 2052    13 年前

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

    事实上,我一直这样做的原因是因为我所有的站点都默认启用了magic-quotes,并且一旦你使用这两个解决方案中的一个编写了大量代码,就需要大量的工作来更改另一个解决方案。