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

Php 如何防止LAMP应用程序中的SQL注入?,php,sql,mysql,lamp,Php,Sql,Mysql,Lamp,以下是开始对话的几种可能性: 初始化时转义所有输入 最好在生成SQL时转义每个值 第一种解决方案是次优的,因为如果您想在SQL以外的任何地方使用它,比如在网页上输出它,则需要取消每个值的scape 第二种解决方案更有意义,但手动转义每个值是一件痛苦的事情 我知道,但是我觉得很麻烦。此外,将查询与输入分离也是我关心的问题,因为尽管正确的顺序很重要,但很容易出错,从而将错误的数据写入错误的字段。准备好的语句是最好的答案。你有测试,因为你可能会犯错误 请参阅问题。我一直使用第一种解决方案,因为99%的

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

  • 初始化时转义所有输入
  • 最好在生成SQL时转义每个值
  • 第一种解决方案是次优的,因为如果您想在SQL以外的任何地方使用它,比如在网页上输出它,则需要取消每个值的scape

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


    我知道,但是我觉得很麻烦。此外,将查询与输入分离也是我关心的问题,因为尽管正确的顺序很重要,但很容易出错,从而将错误的数据写入错误的字段。

    准备好的语句是最好的答案。你有测试,因为你可能会犯错误


    请参阅问题。

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


    事实上,我一直这样做的原因是,我所有的网站都默认设置了magic_quotes,一旦你使用这两种解决方案中的一种编写了大量代码,就需要做大量工作才能换成另一种解决方案。

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

    我支持使用预处理语句。如果您想使用准备好的语句,您可能需要检查PHP的PDO函数。这不仅可以让您轻松地运行准备好的语句,还可以让您不调用以mysql、mysqli或pgsql开头的函数,从而更加不依赖数据库。

    PDO可能值得一天,但它还不只是在那里。它是一个DBAL,它的优点(据说)是使供应商之间的切换更加容易。它不是为了捕捉SQL注入而构建的

    不管怎么说,如果您想对输入进行转义和sanatize,使用准备好的语句可能是一个很好的措施(我支持这一点)。虽然我相信这要容易得多,例如利用