解决方案
正如@Rob Walker 所说,参数化查询是最好的选择。如果您使用最新最好的 PHP,我强烈建议您查看 磷酸二氢钾 (PHP 数据对象)。这是一个本机数据库抽象库,支持多种数据库(当然包括 MySQL)以及带有命名参数的准备语句。
其他提示
准备好的陈述就是最好的答案。你必须进行测试,因为你可能会犯错误!
看 这 问题。
我会选择使用准备好的语句。如果您想使用准备好的语句,您可能想查看 PHP 的 PDO 函数。这不仅可以让您轻松运行准备好的语句,还可以通过不调用以 mysql_、mysqli_ 或 pgsql_ 开头的函数,让您与数据库更加无关。
PDO 可能有一天会变得值得,但现在还不是时候。它是一个 DBAL,它的优势(据说)是使供应商之间的切换更加容易。它并不是真正为捕获 SQL 注入而构建的。
不管怎样,你想逃避和清理你的输入,使用准备好的语句可能是一个很好的措施(我赞同这一点)。尽管我相信这要容易得多,例如通过利用 筛选.
我总是使用第一个解决方案,因为 99% 的情况下,变量 $_GET
, $_POST
, , 和 $_COOKIE
永远不会输出到浏览器。您也不会错误地使用 SQL 注入编写代码(除非您不在查询中使用引号),而使用第二种解决方案时,您可能很容易忘记最终转义其中一个字符串。
实际上,我总是这样做的原因是因为我的所有网站默认情况下都启用了 magic_quotes 设置,一旦您使用这两种解决方案之一编写了大量代码,就需要大量工作来更改到另一个。
不隶属于 StackOverflow