在登录系统中,如果用户想要保持登录状态,则需要将密码存储在浏览器cookie中。我之前经历过很多关于SO的问题,并发现将密码存储在浏览器cookie中并不安全。我想知道我是否喜欢
$string = 'snfcikkfbnvekrew';
$salt = md5($passwrod.$string);
$password = md5(sha1(md5("$salt$string$salt"))); //or some other random sequence of encryption functions
我只是想知道如果有人访问cookie会发生什么样的攻击?
答案 0 :(得分:10)
为什么需要在Cookie中存储密码?为什么不使用其他用户标识符,例如内部用户ID或某种临时值?
“商店”和“密码”是两个应该很少一起使用的词,当它们使用时应该仔细仔细检查。
答案 1 :(得分:7)
如果有人访问了Cookie,即使它已经过哈希处理,他们也会拥有与您的网站用户相同的访问权限,直到Cookie过期为止。即使它过期,除非服务器上的密码已更改,否则仍可使用相同的散列值进行登录。
如果您希望允许他们在不登录的情况下再次访问密码,而不是存储密码,请设置一个cookie,其中包含与其用户帐户一起存储的其他随机令牌值。在每个页面访问和表单提交时,您可以重新生成并存储新的随机令牌,并将cookie重置为新值。这样,存储的价值就会不断变化,所以如果恶意用户在传输过程中获得了cookie,那么在他们能够使用它时,它可能已经发生了变化。
最后,如果您要存储以后登录的任何值,您应该通过SSL执行此操作并仅通过SSL发送cookie。
答案 2 :(得分:4)
使用$_SESSION
而不是编制自己的Cookie系统,而是让会话持续一段时间:
// keep user logged in 6 months
session_set_cookie_params ( $lifetime = 6 * 30 * 24 * 60 * 60 );
session_start();
if ($login == TRUE) {
$_SESSION["user"] = $user_name_or_id;
}
答案 3 :(得分:1)
永远不要尝试在cookie中存储密码。最好在cookie中存储session_id,而在服务器上的会话中存储密码。您无法想象黑客如何轻松解码您刚刚编码的字符串。
答案 4 :(得分:0)
密码本身不需要存储在cookie中,因为你永远无法检索它并反转它以证明它是正确的密码。但是如果你想使用一些密码/电子邮件/ recId的算法组合/你可以在内部检查的任何东西,那么请继续加盐你的字符串。我可能会使用一些未加密或可逆UID的组合以及一个独特且可重新加密的密钥,这样我就可以查找有问题的记录并进行验证,例如
select 1 as loggedIn from userTable as u where u.uid=[cookie.uid] and md5(concat(u.email,u.accountcreated,u.lastlogin))=[cookie.hash]
答案 5 :(得分:0)
我已经非常成功地使用了“安全Cookie协议”(6页)
中解释的方法http://www.cse.msu.edu/~alexliu/publications/Cookie/cookie.pdf