我正在为这个我和 friend 一起写的登录系统运行一些测试,我们已经用转义而不是准备编写了代码。我们确保它不受任何作为 post_user 和 post_pass 变量的影响。 你能检查一下吗?
$_POST['post_user'] = mysql_real_escape_string($_POST['post_user']);
$_POST['post_pass'] = mysql_real_escape_string($_POST['post_pass']);
$query = mysql_num_rows(mysql_query("SELECT * FROM `users` WHERE
`user`='".$_POST['post_user']."' AND `pass`='".md5($_POST['post_pass'])."' AND
`rank`='0'"));
if($query == 1) {
$_SESSION[$this->host().'-us_user'] = $_POST['post_user'];
$_SESSION[$this->host().'-us_pass'] = md5($_POST['post_pass']);
$_SESSION[$this->host().'-us_token'] = $this->generateToken(16);
}
最佳答案
这种方法有两个错误,都来自同一个错觉。
mysql_real_escape_string
不会“保护”您的数据。因此,绝不能将其用于任何“ sanitizer ”目的。像这样使用此功能,您会将自己暴露在两种虽然不是直接但很可能的危险中。
- 在散列之前转义密码可能会破坏生成的散列。
- 转义 SQL 字符串旁边的任何值都将导致注入(inject)。
这就是为什么您应该始终使用参数化而不是“转义”。只是因为参数化正在发挥作用,而使用“转义”只是出于混淆。
我在你是 welcome to read 的文章中写了一个关于转义/参数化的完整解释。 .
关于php - 此代码是可转义的还是易受 SQL 注入(inject)攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22926194/