PHP / MYSQL防止sql注入攻击功能

时间:2012-06-04 12:52:43

标签: php mysql sql function sql-injection

我想升级并制作更系统的,防范sql注入攻击。我收集了三个主要方法是pdo,预处理语句和mysql_escape_string,pdo被认为是最好的,但如果你是一丝不苟的话,认为mysql_escape_string是足够的。我不认为我准备去PDO或准备语句,因为我有很多涉及多个表的复杂查询,所以这将是一项艰巨的任务。但我想更多地使用mysql_escape_string编程。

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

这是基本功能。

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

5 个答案:

答案 0 :(得分:3)

  

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

巨大?也许。值得努力。

  

将逃避整个查询创建问题

是。你的函数无法知道一段SQL是注入攻击还是你想要的东西。

您必须在插入 SQL 的位置转义 text 。你不能在SQL中插入文本,然后找出哪个位是SQL,以及之后是哪个位文本。

  

还有什么应该进入函数,例如htmlspecialchars和strip_tags

strip_tags抛出数据。我不会用它。

strip_tagshtmlspecialchars都可以防止将不安全的数据插入到HTML文档中。在将数据插入HTML文档之前使用它们,而不是在将数据插入SQL之前使用它们。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

示例:

"Select Id from table where username ='".mysql_real_escape_string($username)."' limit 1";

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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