MySQLi用fetch_assoc准备,还是mysql_real_escape_string可以使用?

时间:2011-10-31 19:41:39

标签: php pdo mysqli

我继承了一个中等大小的代码库,它广泛使用了mysql_fetch_assoc和mysql_fetch_object,并且没有任何防止SQL注入的安全预防措施。我认为这是一件需要修理的非常糟糕的事情。

最初,我打算转移到mysqli prepare / bind_param / execute语句来处理数据库查询。但是,以下内容不起作用:

$stmt = $GLOBALS['db']->prepare('SELECT * FROM Users WHERE Username=?');
$stmt->bind_param('s', $username);
$stmt->execute();

// Somehow retrieve the fetched row as an object (Doesn't work!)
return $stmt->fetch_assoc();

问题1:有没有办法使用prepare / bind来使用fetch_assoc或fetch_object?我可以重构所有代码,但它会很麻烦,需要很长时间。

问题2:如果无法做到这一点,从安全的角度来看,使用mysqli_query()是否同样有效,只要所有输入都通过mysql_real_escape_string()正确转义?你还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

  1. $row = $stmt->fetch(PDO::FETCH_ASSOC)参考:http://php.net/manual/en/pdostatement.fetch.php

  2. 如果需要,可以使用mysqli。只要你对进入SQL语句的所有用户数据(包括你自己的数据)使用real_escape_string函数,那么它就比使用预准备语句更安全了 - 错过帖子并打开漏洞要容易得多。

答案 1 :(得分:0)

用原始mysli替换原始mysql几乎没有意义 事实上,所有那些有害的重复性准备/绑定/执行/获取都像mysql_query / fetch一样丑陋。

如果你要重构你的代码,你必须开发一些函数,它将接受一个查询,它的参数作为参数并返回一个数据数组,完成所有的内部提取。

对于通过mysql_real_escape_string()转义所有输入,它将等同于魔术引号,最后被认为是一种不好的做法。

事实上,mysql_real_escape_string()并不能保证任何数据安全。它根本与安全无关。它只是一个格式化例程,仅适用于字符串。但是还有其他类型要插入到查询中。有关详细说明,请参阅我的前言,How to include a PHP variable inside a MySQL insert statement