繁体   English   中英

用PHP设计安全的自动登录cookie系统

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM