我正在运行这个登录系统的一些测试我和我的朋友写的,我们已经写了我们的代码与转义,而不是准备。我们正在确保它是无懈可击的任何作为一个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);
}
3条答案
按热度按时间5t7ly7z51#
这种方法有两个缺点,都来自一个单一的错觉。
mysql_real_escape_string
并不“保护”你的数据。所以,它永远不应该被用于任何“净化”的目的。像这样使用这个函数,你会把自己暴露在两个不直接但很可能的危险中。1.在散列之前转义密码可能会破坏生成的散列。
1.转义SQL字符串旁边的任何值都将导致注入。
这就是为什么你应该总是使用参数化而不是“转义”,因为参数化正在完成它的工作,而“转义”仅仅是出于混乱。
我在一篇文章中用转义/参数化写了一个完整的解释,你是welcome to read。
pgky5nke2#
这应该没问题,因为您使用的是mysql_真实的_escape_string。
如果您正在构建一个新系统,您应该考虑使用PDO或MySQLI预准备语句,这很容易,也不太容易出现安全问题。
我看到的唯一问题是你在会话中存储密码,这是一个非常糟糕的主意,特别是如果你在共享主机上。
enxuqcxy3#
这两种逃避都是错误的。
1.如果你想在网页上显示用户名,它可能会以虚假的反斜杠结束。MySQL转义字符串只能用于向MySQL传递数据。
1.密码转义可能会在密码中引入反斜杠,这会导致您存储与用户输入的密码不同的密码的MD5哈希。如果必须,请转义MD5输出。
您还应该阅读Your Common Sense's answer中提到的优秀文章。