[英]Designing a secure auto login cookie system in PHP
我想要为用户进行自动登录选项检查。 基本上这意味着cookie将存储在客户端。
现在的问题是,如何使其安全,以便cookie不会被欺骗/修改。
我的一个朋友建议使用一个db表来存储session_id,用户的ip,浏览器信息等,然后在用户再次访问网站时将其与所有信息进行比较。
我觉得有一张单独的桌子有点太麻烦了。 还有另一种方法吗? 也许有令牌或类似的东西?
你想要这个臭名昭着的cookie越安全,它对你来说就越麻烦。 如果您的用户应该特别安全,那么您将不得不采用最麻烦的方法。
如果您希望尽可能安全,则只应使用https接受此cookie。 如果通过http接受cookie,它可能会被嗅探并被盗。
我建议cookie根本没有用户数据(一个令牌,正如你的建议)。 不幸的是,这将需要另一张桌子。 当用户登录并选择“保持登录”时,在此表中创建一个条目。 该条目可以是任何无意义的值(例如md5(uniqid('', true));
此标记在DB中可以是唯一的并映射到用户的ID。
当用户访问您的网站时,您可以检查该cookie的值并获取其所属的用户并将其登录。此时,您将销毁旧令牌并创建一个新令牌。 “毁灭”可能意味着许多事情。 您可以完全从数据库中删除它,也可以使用一个禁用令牌的标志。 您可能希望允许多次使用相同的令牌,以防收到cookie但由于某种原因身份验证没有通过,但我认为这是不安全的。 您可能还希望存储令牌的时间戳,并且只有在某段有限的时间内(例如30天)才接受它。
正如您的朋友指出的那样,您可以存储其他信息,例如用户代理,IP地址等,但即使使用相同的浏览器(尤其是移动设备),如果用户的持久登录不被接受,这些信息也可能会发生变化。 ,它可能是刺耳的,不方便他们。
如果你真的不想创建另一个表,那么你必须存储一些方法来从cookie值中获取用户的ID。 这不太安全。
对于我所知道的大多数自动登录,有一个单独的表来存储登录的会话。 每个自动登录会话都被分配一个散列密钥作为标识符,密钥相当长,几乎不可能欺骗。 如果您不希望用户使用有效代码登录交叉IP,请尝试此操作。
function gen_uniqueIdent($length=32){
$alphabet = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789');
$key = '';
for($loop=0;$loop<$length;$loop++){
$i = mt_rand(0,count($alphabet)-1);
$key.= $alphabet[$i];
}
return $key;
}
登录时将此值分配给用户cookie。 然后将其存储到db中:
function save_ident($identFromFunctionAbove,$authenticated_user_id){
//hash this with something unique to the user's machine
$hashed = md5($identFromFunctionAbove . $_SERVER['REMOTE_ADDR']);
/** Some actions to remember this hash **/
}
将其保存到与user_id等用户身份相对应的数据库中。
现在验证用户cookie后,您可以简单地:
function validateCookie(){
$ident = $_COOKIE['yourCookieName'];
$hashed = md5($ident . $_SERVER['REMOTE_ADDR']);
/** Check if this hashed value exists in db, if it does, authenticate user **/
}
您还需要在会话过期或用户明确注销后删除它们。
当然这很简单,并不考虑md5或ident碰撞。 仍然,让两个32个字符的随机生成的字符串与之前生成的字符串相同,这是一个很小的机会。
我以前这样做的方法是存储密码的MD5哈希值而不是实际密码。
在服务器端,您需要检查登录是否来自cookie,然后在通过MD5进行哈希处理后检查哈希是否与数据库中的密码相同
这样,如果有人攻击用户计算机,他们永远不会知道密码的价值,但是仍然可以使用该cookie仅对您的服务器进行身份验证。
你可以通过让cookie在x天后过期来使这更安全,所以如果cookie被盗,那么theif只能访问那段时间。
在一天结束时最多也是唯一的? 安全方法是让用户每次登录
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.