大家好,我读了很多关于安全的" remember me " php登录
我想使用这个算法:
1-为coocookei创建一个像这样的数据库:
$sql = "CREATE TABLE IF NOT EXISTS Cookie
(
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
pid INT(10) UNSIGNED NOT NULL, #user id
token VARCHAR(254) COLLATE utf8_persian_ci NOT NULL,
expires INT(11) NOT NULL,
UNIQUE (token),
FOREIGN KEY (pid) REFERENCES Profile (id)
) DEFAULT COLLATE utf8_persian_ci";
2-当用户成功登录时,系统生成一个包含md5(uniqid(rand(), true))
、date of last login
和user id
的随机令牌cookie
3- md5(uniqid(rand(), true))
和date of last login
和user id
将存储在MYSQL数据库中。
4-第二次登录时,系统读取cookie信息并与Cookie
表进行核对。如果正常,用户将登录!并生成新的令牌。
这种方法安全吗?
黑客是否可以窃取令牌(从用户计算机)并使用假cookie登录?
2-当用户成功登录时,系统创建一个包含
md5(uniqid(rand(), true))
、date of last login
和user id
的随机令牌cookie3-
md5(uniqid(rand(), true))
和date of last login
和user id
将被存储在MYSQL数据库中。
除了ScottMcGready所说的,我想强调这一点:
uniqid(rand(), true)
是不是一个加密安全伪随机数生成器。
添加md5()
也不会使它如此。
另外,如果你想了解更多关于安全的"记住我"。链接的博客文章总结了目前安全实现它们的最佳策略(2015年)。
这里有几个问题,让我试着解释一下为什么这是一个不好的方式来实现你想要的:
数据库饼干
表方面,这看起来不错。但请注意,如果没有更多地访问您的代码,我无法判断您的系统是否定期修剪令牌,或者原始令牌是否被覆盖。考虑到这一点,值得注意的是,Cookie
表中记录的INT(10)
的最大值为4,294,967,295。如果生成的每个令牌都作为新行添加到数据库中,这可能很快就会导致问题。例如,在令牌生成脚本中—如果发生循环…
话虽如此,表的结构并没有太大的问题。
哈希
我个人不会使用md5()
来生成令牌,因为碰撞的可能性相当高。从另一个Stack Overflow的答案中,我认为这是相当不错的:
bin2hex(openssl_random_pseudo_bytes(16));
它使用OpenSSL为好…不确定性。
存储在数据库
为什么不存储当前日期而不是上次日期?当前日期可用于提供到期日期并从数据库中删除旧令牌(即>24小时)。如果发生了什么不正常的事情,还可以考虑存储IP地址或其他信息,以便进行跟踪。
检索登录这是你最可能被攻击的地方。无论您拥有什么登录脚本,都应该检查许多事情,例如暴力攻击,并相应地处理它。你很有可能不会堵住所有的漏洞,让人们意外或故意地窃取另一个人的cookie。
所以,如果你真的,真的,真的,真的想,你可以创建你自己的登录/认证系统-我的建议是不要,但是你的问题是关于你自己的方法的,所以我已经调整了我的回答来反映这一点。
最后的想法:如果你在网上问别人某件事是否安全,很可能不是。