我的“记住我”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 login
和user id
的随机令牌的cookie
3- md5(uniqid(rand(), true))
和 date of last login
和 user 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 login
和user id
的随机令牌的cookie3-
md5(uniqid(rand(), true))
和date of last login
和user 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 登录系统有多安全? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章