记住我的最佳练习功能[重复
-
30-09-2019 - |
题
这个问题在这里已经有一个答案:
我在cookie(7天到期)中使用了2个变量,即用户ID和哈希。哈希是用户代理和用户ID的SHA1编码。在这种情况下,一些黑客可以登录知道被盗饼干的浏览器的人。我应该遵循哪种方式,或者最好记住我的安全问题?
解决方案
虽然您可以哈希user_id和secret_key,但任何拦截此cookie的人都可以登录到您的应用程序。除此之外,您还可以做到这一点,以便您记住我的饼干很快就过时了。没有人喜欢陈旧的饼干。
您可以将每个用户的最后一次访问的时间戳存储在数据库和cookie中。每当您阅读cookie以登录用户时,都可以检查两个时间戳匹配。如果他们不这样做,请拒绝用户。如果这样做,请更新时间戳。
使用此方法,每当您的用户返回您的网站时,所有旧cookie都会陈旧。现在拦截了饼干的黑客现在有一个毫无价值的饼干,因为他不知道当前饼干中的确切时间戳记。当然,黑客可以随意使用新鲜的曲奇,直到用户重新登录。
//check for cookie
if(isset($_COOKIE['remember_me'])) {
// get hash and time stamp from cookie
$hash = substr($_COOKIE['remember_me'],0,40);
$last_visit = substr($_COOKIE['remember_me'],41);
// query your db with $hash and $last_visit
// if hash and time stamp match up
// log in
// store the current time stamp in a variable to use for both
$time = date("Y-m-d H:i:s");
// update the time stamp in your cookie
$cookie = $pass . "-" . $time;
setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
// update the time_stamp in your database
else {
// remove the remember me cookie
setcookie('remember_me', '', time()-42000, '/')
}
该方法提供了少量的安全性,当然应该按照其他答案中提出的侧面方法使用。哈希键应存储在cookie中。请记住,我的cookie不能完全安全,因此对于高度敏感的数据或应用程序功能,应需要重新输入密码。
我还建议将您的cookie命名以外的东西,以使其难以找到。虽然它不会增加太多的安全性,但如果有的话,命名您的cookie“ ht33424''需要将其命名为'rememan_me'或'hack_me'的命名。
其他提示
您可以将到期日期设置为现在,再加上一年的cookie,但是在所有敏感区域中都有一个Enter密码字段,就像Amazon使用的实现一样。被劫持的cookie将授予访问权限,但要购买或修改任何个人需要重新输入密码。
“记住我”表的问题是,如果黑客可以访问此表,他可以创建并登录到他想要的尽可能多的帐户。您可以争辩说,它加强了记住我功能的安全性,但是需要权衡它,以减轻膝盖安全区域的风险。
就个人而言,我创建一个随机的哈希,然后将其存储在“记住我”桌子中。该表还具有用户代理,用户ID和IP地址。每次我从nemple-me函数重新使用用户时,我都会检查两者。如果用户手动注销,我只需从表中删除该行即可。然后,如果他们再次登录,它将创建一个新的随机哈希。确实没有办法与记住我系统嗅探数据包的人打击(除非您使用仅使用HTTPS标志的安全cookie使用安全的cookie)。因此,请与仅HTTPS的cookie使用安全连接。如果不能,那么至少将哈希人随机进行,因此如果发现它至少可以生成一个新的哈希来杀死该登录...
您最终可以使用会话来存储用户状态。但是举行会话会导致相同的问题,当会话ID被盗时。您可以与其他一些(例如浏览器或IP地址)一起加入Cookie信息,但是当用户没有静态IP时,它会引起问题。
无论如何,持有会话ID更安全,仅将用户的SHA1递送密码放在cookie上。
HMAC
我通常这样做,所以我什么也没存储在数据库或类似的服务器端。
您必须生成随机字符串,该字符串成为您的“秘密密钥”,并且必须存储在服务器端(可能是在配置PHP脚本中作为常数),并且您永远不得不告诉任何人。我称这个秘密钥匙 SECRET_KEY
.
然后,您的cookie必须设置两个值:
USER_ID
: :将自动登录的用户IDHASH
: :安全的加密哈希USER_ID
和SECRET_KEY
. 。所以,例如,md5(USER_ID . "-" . SECRET_KEY)
. 。 (首选与MD5不同的东西,例如SHA1或SHA256)。
因此,您的最终饼干可能是: USER_ID:HASH
.
然后,当您必须检查cookie是否是真正的记住我的cookie时,您必须这样做:
function isCookieGenuine($cookie_value) {
list($value, $hash) = explode(':', $cookie_value, 2);
if (md5($value . "-" . SECRET_KEY) == $hash)
return true;
else
return false;
}
关键是,只有您才能生成通过此检查的哈希,因为哈希不仅需要 USER_ID
但也是 SECRET_KEY
那是未知的 除服务器以外的任何人! :)
如评论中所述,您可以使用 hash_hmac
php> = 5.1.2中的功能: http://us.php.net/manual/en/function.hash-hmac.php