Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQLi准备使用fetch\u assoc,还是mysql\u real\u escape\u字符串可以使用?_Php_Pdo_Mysqli - Fatal编程技术网

Php MySQLi准备使用fetch\u assoc,还是mysql\u real\u escape\u字符串可以使用?

Php MySQLi准备使用fetch\u assoc,还是mysql\u real\u escape\u字符串可以使用?,php,pdo,mysqli,Php,Pdo,Mysqli,我继承了一个中等规模的代码库,它广泛使用mysql\u fetch\u assoc和mysql\u fetch\u对象,并且没有任何防止SQL注入的安全预防措施。我认为这是一件非常糟糕的事情,需要修复 最初,我打算使用mysqli prepare/bind_param/execute语句来处理数据库查询。但是,以下情况不起作用: $stmt = $GLOBALS['db']->prepare('SELECT * FROM Users WHERE Username=?'); $stmt-&g

我继承了一个中等规模的代码库,它广泛使用mysql\u fetch\u assoc和mysql\u fetch\u对象,并且没有任何防止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:是否有一种方法可以使用fetch\u assoc或使用prepare/bind获取\u对象?我可以重构所有的代码,但这将是混乱的,需要很长时间

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

  • $row=$stmt->fetch(PDO::fetch\u ASSOC)
    Ref:

  • 如果需要,可以使用mysqli。只要您对所有进入SQL语句的用户数据(包括您自己的数据)使用真正的_escape _string函数,那么它的安全性就不亚于使用准备好的语句——只是更容易错过帖子,留下漏洞


  • 用原始mysli替换原始mysql毫无意义。
    事实上,所有那些可怜的重复的prepare/bind/execute/fetch和mysql\u query/fetch一样丑陋

    如果你要重构你的代码,你必须开发一些库函数,它将把一个查询和它的参数作为参数,并返回一个数据数组,在里面进行所有的获取

    至于通过mysql_real_escape_string()转义所有输入,这将是一种等效于魔术引号的做法,这最终被认为是一种不好的做法


    事实上,mysql\u real\u escape\u string()并不能保证任何数据的安全。这与安全毫无关系。这只是一个格式化例程,只适用于字符串。但在查询中还可以插入其他类型。关于详细的解释,请参考我前面的答案,

    看起来这样做,我必须使用PDO而不是mysqli,但我认为这应该可以。mysqli有
    $result=$stmt->get_result()
    ,它应该会返回一个常规的结果集,您可以在上面执行一段时间(fetchrow())类型的操作,但我从未使用过它,所以我不确定这是否正是你想要的