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

我的'有多安全;记住我';php登录系统?,php,security,login,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 VARC

大家好,我读了很多关于安全的“记住我”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))
上次登录日期的
用户id创建一个cookie

3-同样
md5(uniqid(rand(),true))
上次登录日期
用户id
将存储在MYSQL数据库中

4-第二次,当用户登录时,系统读取cookie信息并使用
cookie
表进行检查。如果它是确定的用户将登录!并重新生成新令牌

这种方法安全吗


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

这里有一些问题,让我试着解释一下为什么这是实现您想要的东西的一种糟糕方式:

数据库cookie

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

也就是说,表结构没有太大的问题

散列

就我个人而言,我不会使用
md5()
来生成令牌,因为发生冲突的可能性相当高。从另一个堆栈溢出的答案,这是我认为相当体面的:

bin2hex(openssl_random_pseudo_bytes(16));
它使用OpenSSL的好。。。随机性

将其存储在数据库中

为什么不存储当前日期而不是最后一个日期?当前日期可用于提供到期日期并从db中删除旧令牌(即>24小时)。如果有任何犯规行为,也可以考虑存储IP地址或另一条信息来追踪。

检索登录名

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

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

最后一个想法:如果你在互联网上询问人们某些东西是否安全,那么它可能不安全。

2-当用户成功登录时,系统使用带有
md5(uniqid(rand(),true))
上次登录日期的
用户id创建一个cookie

3-同样
md5(uniqid(rand(),true))
上次登录日期
用户id
将存储在MYSQL数据库中

此外,我想强调这一点:

添加
md5()


此外,如果您想了解更多信息,链接的博客文章总结了当前安全实施这些措施的最佳策略(2015)。

如果您关心安全,你为什么要设计自己的系统而不使用框架或类似oAuth/oAuth2的东西?可能是@nomistic的复制品你真的认为我的问题是关于SQL注入的吗?@ScottMcGready是的,还有很多php登录脚本。我只问一个简单的问题:)@partiz没必要厚颜无耻谢谢你的回答。太完美了,同上。如果你发现了,就发垃圾邮件吧,因为这是一个完全的误解,应该毫不后悔地把它压扁。