我的“记住我”php 登录系统有多安全? [关闭]

Posted

技术标签:

【中文标题】我的“记住我”php 登录系统有多安全? [关闭]【英文标题】:how much secure is my 'remember me' php login system? [closed] 【发布时间】:2015-11-27 07:58:57 【问题描述】:

您好,我读了很多关于安全“记住我”的 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-当用户登录成功时,系统会创建一个带有md5(uniqid(rand(), true))date of last loginuser id的随机令牌的cookie

3- md5(uniqid(rand(), true))date of last loginuser id 也将存储在 mysql DB 中。

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

这种方法安全吗?

黑客是否可以窃取该令牌(来自用户计算机)并使用伪造的 cookie 登录?

【问题讨论】:

如果您担心安全性,为什么要设计自己的系统而不使用框架或类似 oAuth/oAuth2 的东西? How can I prevent SQL-injection in PHP?的可能重复 @nomisitic 你真的认为我的问题是关于 SQL 注入的吗? @ScottMcGready 是的,还有很多 php 登录脚本。我只问一个简单的问题:) @partiz 没必要厚脸皮 【参考方案1】:

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

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

除了what ScottMcGready says,我还要强调一点:

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

添加md5() 也不行。

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

【讨论】:

同上。如果你找到了,请立即发送垃圾邮件,因为这是一个完全的误解,应该毫不留情地予以铲除。【参考方案2】:

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

数据库 cookie

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

话虽如此,表结构并没有太大问题。

散列

我个人不会使用md5() 来生成令牌,因为发生冲突的可能性会相当高。从另一个 Stack Overflow 答案来看,这是我认为相当不错的:

bin2hex(openssl_random_pseudo_bytes(16));

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

将其存储在数据库中

为什么不存储当前日期而不是最后一个日期?当前日期可用于提供过期和修剪数据库中的旧令牌(即 >24 小时)。如果发生任何错误,还可以考虑存储 IP 地址或其他信息以进行跟踪。

检索登录信息

这是您最有可能受到攻击的地方。无论您拥有什么登录脚本,都应该检查一些事情,例如暴力攻击并相应地处理它。你很有可能不会堵住所有的漏洞,让人们意外或故意偷走别人的饼干。

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

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

【讨论】:

感谢您的回答。这是完美的。

以上是关于我的“记住我”php 登录系统有多安全? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中安全地实现“记住我”按钮(持久登录)

PHP登录系统:记住我(持久cookie)[重复]

如何使用 PHP 创建一个安全的“记住我”系统?

PHP Mcrypt,它到底有多安全? [关闭]

我在我的页面的 php 登录中添加一个简单的记住我功能时遇到问题?

在 PHP 中使用“记住我”功能的正确方法