我有一个方法,我检查用户名和密码(哈希+盐)是正确的。之后,如果用户有访问,我会这样做:
if(isset($remember) && $remember == '1') {
setcookie('email', $email, time()+60*60*24*100);
}
else {
setcookie('email', $email, time()+3600);
}
我的问题是关于安全问题。上面的代码是不安全的?它需要像签名一样吗?
例如:
$user_email = $email;
$hash = sha1(rand(0,500).microtime());
$signature = sha1($hash . $user_email);
$cookie = base64_encode($signature . "-" . $hash . "-" . $user_email);
setcookie('authentication', $cookie);
您怎么看?
答案 0 :(得分:3)
您需要验证随机生成的哈希或服务器端的内容。用户可以调整所有需要的数据,并为cookie数据发回任何内容。使用您当前的方案,似乎很容易指定他们想要的任何用户。吓人。
登录时,请在数据库中粘贴身份验证密钥,以及IP,UserAgent和Expiration。如果他们尝试使用您的站点并且IP或UserAgent不同,或者密钥已过期,请强制注销。
答案 1 :(得分:1)
轶事时间:回到2002年左右,我正在寻找来自学校网络的数据包转储,并告诉他们需要修复他们的成绩,出勤率,学生信息,以及阳光下的所有系统。他们设置的方式是这样的:在用户进行身份验证后,系统会设置一个只包含用户名和会话结束时间的cookie。我启动了一个浏览器,选择了一个用户名(首字母,姓氏),并将其设置为cookie。我有权访问。
他们应该做的是设置一个随机的128号码并跟踪服务器中的号码(号码,相应的用户,超时值)。
另见
答案 2 :(得分:0)
为了轻松阻止用户更改Cookie的值,您可以使用网络上的this class。它将编写一个包含与所有cookie值的“总和”相对应的哈希值的cookie,因此如果更改数据,则哈希值将不正确。
只需要三种方法:
Cookie::set(cookie_name, value)
,
Cookie::get(cookie_name)
和
Cookie::reset()
。