8

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

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

第一个解决方案不是最理想的,因为如果您想在 SQL 以外的任何地方使用每个值,例如在网页上输出,则需要取消转义每个值。

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

我知道准备好的语句,但是我发现MySQLi很麻烦。此外,将查询与输入分开也让我感到担忧,因为虽然正确的顺序很重要,但很容易出错,从而将错误的数据写入错误的字段。

4

5 回答 5

10

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

看到这个问题。

于 2008-09-05T23:44:24.340 回答
7

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

于 2008-09-06T00:04:10.500 回答
1

我会使用准备好的语句。如果您想使用准备好的语句,您可能需要查看 PHP 的 PDO 函数。这不仅可以让您轻松运行准备好的语句,还可以通过不调用以 mysql_、mysqli_ 或 pgsql_ 开头的函数,让您与数据库无关。

于 2008-09-06T00:05:05.053 回答
0

PDO 可能有一天会值得,但还不止于此。它是一个 DBAL,它的优势是(据说)使供应商之间的切换更容易。它并不是真正为捕获 SQL 注入而构建的。

无论如何,您想逃避和清理您的输入,使用准备好的语句可能是一个很好的措施(我同意)。虽然我相信它更容易,例如通过使用filter

于 2008-09-06T01:14:55.510 回答
-1

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

实际上,我一直这样做的原因是因为我所有的网站都默认设置了magic_quotes,一旦你使用这两种解决方案之一编写了很多代码,就需要做很多工作来改变到另一个。

于 2008-09-05T23:58:08.550 回答