如何防止 LAMP 应用程序中的 SQL 注入?
Posted
技术标签:
【中文标题】如何防止 LAMP 应用程序中的 SQL 注入?【英文标题】:How do you prevent SQL injection in LAMP applications? 【发布时间】:2010-09-08 00:09:12 【问题描述】:以下是开始对话的几种可能性:
-
在初始化时转义所有输入。
转义每个值,最好是在生成 SQL 时。
第一个解决方案不是最理想的,因为如果您想在 SQL 以外的任何地方使用每个值,例如在网页上输出,则需要取消转义每个值。
第二种解决方案更有意义,但是手动转义每个值很痛苦。
我知道prepared statements,但是我发现mysqli 很麻烦。此外,将查询与输入分开也让我感到担忧,因为尽管正确顺序很重要,但很容易出错,从而将错误的数据写入错误的字段。
【问题讨论】:
【参考方案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 设置,一旦您使用这两种解决方案之一编写了大量代码,就需要花费大量时间努力换成另一个。
【讨论】:
以上是关于如何防止 LAMP 应用程序中的 SQL 注入?的主要内容,如果未能解决你的问题,请参考以下文章