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

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

第一个解决方案不是最优的,因为如果您想在 SQL 以外的任何内容中使用每个值(例如将其输出到网页上),则需要对每个值进行转义。

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

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

有帮助吗?

解决方案

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

其他提示

准备好的陈述就是最好的答案。你必须进行测试,因为你可能会犯错误!

问题。

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

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

不管怎样,你想逃避和清理你的输入,使用准备好的语句可能是一个很好的措施(我赞同这一点)。尽管我相信这要容易得多,例如通过利用 筛选.

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

实际上,我总是这样做的原因是因为我的所有网站默认情况下都启用了 magic_quotes 设置,一旦您使用这两种解决方案之一编写了大量代码,就需要大量工作来更改到另一个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top