可能重复:
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()?
答案 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.。