所以我一直在为我的网站开发一个记住我的函数。
它目前有效,但我一直在使用基本数据,而不是加密,因为我想知道在学习时到底发生了什么。
我使用的是一个cookie,然后是一个存储相同数据的数据库,然后进行检查。每次登录时都会生成一个新的cookie/db条目。
因此,目前这将是cookie:(id的行是一个userid,这个cookie是在登录过程中设置的)
date_default_timezone_set('Europe/London');
$token = '1';
$cookiedate = date('d-m-y h:i:s a', time());
$cookie_val = $row['id'] . ':' . $token . ':' . $cookiedate;
setcookie (
"cookie",
$cookie_val,
time() + (10 * 365 * 24 * 60 * 60),
'/'
);
从这里开始,我的下一步是什么?此外,我也不太确定令牌,它应该是一个随机的字符哈希,只是用作一种额外的安全方法吗?
这个网站不会太大,登录别人的账户你不会造成任何损害,因为敏感页面有密码提示保护。
对现有技术的改进是:
-
生成20个字符的随机令牌,例如:
bin2hex(openssl_random_pseudo_bytes(10));
-
将该令牌与用户标识符(以及其他相关数据)一起存储在数据库中。
-
将令牌值写入cookie中。
这防止了一些问题:
-
令牌数据只在服务器端已知,客户端只获取密钥。
-
用户可以吊销"记住我"令牌,以防止将来未经授权的访问。
-
篡改cookie值将导致未知的令牌值,因此访问将被拒绝。
成功登录后,您将生成一个新的令牌。
通常,为了避免数据篡改,可以使用hash_hmac()
使用密钥对特定值进行散列。
为什么不简单地使用md5()对cookie进行哈希处理呢。