快速MySQLi安全问题

时间:2010-05-23 19:04:13

标签: php security mysqli

  

可能重复:
  Do I have to use mysql_real_escape_string if I bind parameters?

我有一个快速的MySQLi安全相关问题......

例如,看一下这段代码(从用户那里获取输入,根据数据库检查它是否存在用户名/密码组合):

$input['user'] = htmlentities($_POST['username'], ENT_QUOTES);
$input['pass'] = htmlentities($_POST['password'], ENT_QUOTES);

// query db
if ($stmt = $mysqli->prepare("SELECT * FROM members WHERE username=? AND password = ?"))
{
    $stmt->bind_param("ss", $input['user'], md5($input['pass'] . $config['salt']));
    $stmt->execute();
    $stmt->store_result();

    // check if there is a match in the database for the user/password combination
    if ($stmt->num_rows > 0)
    {}
}

在这种情况下,我在表单数据上使用htmlentities(),并使用MySQLi预处理语句。我还需要使用mysql_real_escape_string()?

2 个答案:

答案 0 :(得分:2)

不,如果使用预准备语句绑定参数,则不需要使用mysql_real_escape_string。事实上,使用它会给你错误的结果,因为转义的数据将被插入到数据库中。当参数直接写入SQL字符串而不使用参数时,需要mysql_real_escape_string

答案 1 :(得分:1)

是的,因为有非html相关实体可能会对您的数据库造成损害,导致真正的转义字符串捕获。像UTF-8字符一样。

但正如评论中所说,你正在使用mysqli prepare,这就足够了。

如果你有兴趣,BTW MySQLi有it's own escape string function.