我的"记住我"PHP 登录系统有多安全?



大家好,我读了很多关于安全的" 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 loginuser id的随机令牌cookie

3- md5(uniqid(rand(), true))date of last loginuser id将存储在MYSQL数据库中。

4-第二次登录时,系统读取cookie信息并与Cookie表进行核对。如果正常,用户将登录!并生成新的令牌。

这种方法安全吗?

黑客是否可以窃取令牌(从用户计算机)并使用假cookie登录?

2-当用户成功登录时,系统创建一个包含md5(uniqid(rand(), true))date of last loginuser id的随机令牌cookie

3- md5(uniqid(rand(), true))date of last loginuser 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。

所以,如果你真的,真的,真的,真的想,你可以创建你自己的登录/认证系统-我的建议是不要,但是你的问题是关于你自己的方法的,所以我已经调整了我的回答来反映这一点。

最后的想法:如果你在网上问别人某件事是否安全,很可能不是。

最新更新