饼干系统 - 安全

时间:2011-11-04 16:43:48

标签: php security cookies

我有一个方法,我检查用户名和密码(哈希+盐)是正确的。之后,如果用户有访问,我会这样做:

 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); 

您怎么看?

3 个答案:

答案 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()