以下是开始对话的几种可能性:
- 初始化时转义所有输入。
- 转义每个值,最好是在生成 SQL 时。
第一个解决方案不是最理想的,因为如果您想在 SQL 以外的任何地方使用每个值,例如在网页上输出,则需要取消转义每个值。
第二种解决方案更有意义,但手动转义每个值很痛苦。
我知道准备好的语句,但是我发现MySQLi很麻烦。此外,将查询与输入分开也让我感到担忧,因为虽然正确的顺序很重要,但很容易出错,从而将错误的数据写入错误的字段。
准备好的陈述是最好的答案。你有测试,因为你会犯错误!
看到这个问题。
正如@Rob Walker 所说,参数化查询是您最好的选择。如果您使用的是最新最好的 PHP,我强烈建议您查看PDO(PHP 数据对象)。这是一个原生数据库抽象库,支持广泛的数据库(当然包括 MySQL)以及带有命名参数的准备好的语句。
我会使用准备好的语句。如果您想使用准备好的语句,您可能需要查看 PHP 的 PDO 函数。这不仅可以让您轻松运行准备好的语句,还可以通过不调用以 mysql_、mysqli_ 或 pgsql_ 开头的函数,让您与数据库无关。
PDO 可能有一天会值得,但还不止于此。它是一个 DBAL,它的优势是(据说)使供应商之间的切换更容易。它并不是真正为捕获 SQL 注入而构建的。
无论如何,您想逃避和清理您的输入,使用准备好的语句可能是一个很好的措施(我同意)。虽然我相信它更容易,例如通过使用filter。
我一直使用第一种解决方案,因为 99% 的时间里$_GET
,$_POST
, 和$_COOKIE
中的变量永远不会输出到浏览器。您也永远不会错误地使用 SQL 注入编写代码(除非您不在查询中使用引号),而使用第二种解决方案,您最终很容易忘记转义一个字符串。
实际上,我一直这样做的原因是因为我所有的网站都默认设置了magic_quotes,一旦你使用这两种解决方案之一编写了很多代码,就需要做很多工作来改变到另一个。