我的'记住我'php登录系统有多安全?

时间:2015-09-01 23:39:23

标签: php security login

在那里,我读了很多关于安全'记住我'的PHP登录

我想使用这个算法:

1-为coockei创建一个数据库,如下所示:

$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-当用户成功登录时,系统会创建一个包含随机令牌的Cookie,其中包含md5(uniqid(rand(), true))date of last login以及user id

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

4-第二次,当用户登录时,系统读取cookie信息并检查Cookie表。如果没问题,用户将登录!并重新生成新令牌。

这种方法安全吗?

黑客可以窃取该令牌(形成用户计算机)并使用假cookie登录?

2 个答案:

答案 0 :(得分:3)

  

2-当用户成功登录时,系统会创建一个包含随机令牌的Cookie,其中包含md5(uniqid(rand(), true))date of last login以及user id

     

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

除了what ScottMcGready says之外,我想强调一点:

uniqid(rand(), true) is not a cryptographically secure pseudo-random number generator

添加md5()也不会这样做。

此外,如果您想了解有关secure "remember me" cookies in PHP的更多信息,链接的博客文章总结了当前实施安全的最佳策略(2015)。

答案 1 :(得分:1)

这里有一些问题,让我试着解释为什么这是实现你想要的一个坏方法:

数据库Cookie

表明,这看起来还不错。请注意,如果没有更多的代码访问权限,我无法判断您的系统是否定期修剪令牌或者原始令牌是否被覆盖。考虑到这一点,值得注意的是INT(10)表中记录的Cookie最大值为4,294,967,295。如果生成的每个令牌都作为新行添加到数据库中,则可能会很快导致问题。例如,在令牌生成脚本上 - 如果要发生循环......

话虽如此,表结构并没有太大的错误。

<强>散列

我个人不会使用md5()来生成令牌,因为碰撞的可能性会相当高。从另一个Stack Overflow回答中,这是我认为相当不错的东西:

bin2hex(openssl_random_pseudo_bytes(16));

它使用OpenSSL以实现良好的随机性。

将其存储在数据库中

为什么不存储当前日期而不是最后日期?当前日期可用于从db提供到期和修剪旧令牌(即> 24小时)。如果发生任何犯规,还应考虑存储IP地址或其他信息以便追溯。

检索登录

这是你最有可能受到攻击的地方。无论你有什么登录脚本,都应该检查一些事情,比如暴力攻击并相应地处理它。您很可能不会插入所有洞并允许人们意外或故意偷走他人的cookie。

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

最后的想法: 如果你在互联网上询问某些人是否安全,那可能不是。