-3

我想升级并使之更系统化,我的保护免受 sql 注入攻击。我收集了三个主要方法是 pdo、prepared statements 和 mysql_escape_string,pdo 被认为是最好的,但如果你很细致,mysql_escape_string 被认为是足够的。我认为我还没有准备好使用 PDO 或准备好的语句,因为我有很多涉及多个表的复杂查询,所以这将是一项艰巨的任务。但我想更加程序化地使用 mysql_escape_string。

我没有转义用户提交的每个单独变量,而是考虑使用可能需要一些修改来处理标点符号的标准函数转义 SQL 命令这是一种合理的方法还是转义整个查询会产生问题 - 我确实使用撇号、反引号和 %,例如。似乎每个 sql 语句的标准函数会比变量方法更系统和标准。那么问题是可能需要进行哪些修改来处理标点符号?另外,当我收集到 mysql_escape_string 不是 100% 完成时,是否还有其他内容应该进入函数,例如 htmlspecialchars 和 strip_tags?

这里是基本功能。

function safe($sql) {
$safesql = mysql_real_escape_string($sql);
return $safesql;
}
4

5 回答 5

3

我认为我还没有准备好使用 PDO 或准备好的语句,因为我有很多涉及多个表的复杂查询,所以这将是一项艰巨的任务。

巨大的?也许。不过值得努力。

转义整个查询会产生问题

是的。您的函数将无法知道一段 SQL 是注入攻击还是您想要的。

您必须在将文本插入SQL的位置对文本进行转义。您不能在 SQL 中插入文本,然后找出哪一位是 SQL,哪一位是文本。

是否还有其他内容应该进入该函数,例如 htmlspecialchars 和 strip_tags

strip_tags丢弃数据。我不会用它。

两者都strip_tags提供htmlspecialchars保护,防止将不安全的数据插入 HTML 文档。在将数据插入 HTML 文档之前使用它们,而不是在将数据插入 SQL 之前使用它们。

于 2012-06-04T12:56:11.217 回答
0

就个人而言,我认为您可以放心地假设自己保护您的“复杂查询”比仅使用 PDO、ActiveRecord 等要复杂得多且耗时得多。此外,您将使您的代码更加与数据库无关。

于 2012-06-04T13:17:00.173 回答
0

使其适用于整个查询的唯一方法是编写自己的 SQL 解析器,即使那样,您也必须尝试神奇地查看 查询的哪些部分是 SQL 注入。这是不可能的,所以不,您不能一次对整个查询执行此操作。

于 2012-06-04T12:57:29.100 回答
0

只是为了澄清一下,您不应该mysql_real_escape_string在整个查询中使用,而应该只使用您用于构建查询的字符串值。

例子:

"Select Id from table where username ='".mysql_real_escape_string($username)."' limit 1";
于 2012-06-04T12:58:50.860 回答
-1

我个人喜欢 phpBB 的人写的 db-class。它非常出色、快速且非常安全。

于 2012-06-04T13:01:19.043 回答