如何防止 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 注入?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server如何防止动态sql中的sql注入

如何防止 PYTHON-DJANGO 中的 SQL 注入?

使用“database/sql”时如何防止 Go 中的 SQL 注入攻击?

如何防止Android中的SQL注入?

如何防止sql注入攻击?

如何防止 JSP 中的 SQL 注入?