2011-11-04 218 views
1

我有一个方法,我检查用户名和密码(哈希+盐)是正确的。之后,如果用户已经进行了我的操作:饼干系统 - 安全

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

你觉得呢?

+1

如何检查是否有人登录? – ComFreek

+0

好吧,我只检查cookie是定义(isset)还是空的 – anvd

+1

哦,这是非常不安全的,因为在浏览器中手动设置cookie非常简单! – ComFreek

回答

1

轶事时间:早在2002年,我正在查看来自我学校网络的数据包转储,并告诉他们他们需要修正他们的成绩,出勤率,学生信息以及所有日光照射系统。他们设置的方式是在用户通过身份验证之后,系统会设置一个只包含用户名和会话结束时间的cookie。我启动了一个浏览器,选择了一个用户名(第一个姓,名),并将其设置为一个cookie。我有权访问。

他们应该做的事情是设置一个随机的128号码并跟踪服务器(号码,相应的用户,超时值)。

3

你需要验证一个随机生成的哈希或服务器端的东西。用户可以根据需要调整数据,并发送任何返回的cookie数据。用你目前的方案,似乎很容易指定他们想要的任何用户。害怕。

登录时,将身份验证密钥与IP,UserAgent和Expiration一起粘贴到数据库中。如果他们尝试使用您的站点并且IP或UserAgent不同,或者密钥已过期,请强制注销。

0

为了便于防止用户更改cookie的值,您可以使用网上找到的this class。它将编写一个包含与所有cookie值的“总和”对应的哈希的cookie,因此如果更改数据,哈希将不正确。

只需要三个方法: Cookie::set(cookie_name, value)Cookie::get(cookie_name)Cookie::reset()