所以,现在这是它的工作原理:
>用户登录后,在验证和清理输入后,我检查用户是否存在,并使用PHPs password_verify将密码与存储在数据库中的散列密码进行比较.
>如果登录成功,我将管理员重定向到dashboard.PHP并创建一个名为adminId的会话变量,并将用户ID存储在该变量中.
这是我的第一个问题:
攻击者可以更改$_SESSION [‘adminId’]的值吗?例如,从1更改为12,因此以不同的管理员身份登录?
无论如何,我读过this article引入攻击者可以使用的多个漏洞.
所以,如果我没有错,我应该使用cookie进行持久登录吗?
好的,首先是永远不要将用户ID存储在cookie中并使用它来检查登录,因为攻击者可以轻松地改变它吗?
很好,所以我可以创建一个随机令牌(使用random_bytes然后转换为十六进制)并将其与数据库中登录表中的用户ID配对.
例如,我有这个:
token: 2413e99262bfa13d5bf349b7f4c665ae2e79e357,userId: 2
因此,用户登录时,会创建令牌,并使用userId存储在数据库中.
假设用户关闭了浏览器.
然后他再次打开它,它所拥有的是带有令牌的cookie:2413e99262bfa13d5bf349b7f4c665ae2e79e357.所以,它会自动以userId:2登录用户吗?
如果他想以userId:10为用户登录,他需要知道与该用户配对的随机令牌.
很好,但是那就是这个问题:时间泄漏.所以他们提出了一个使用两个东西的解决方案,一个选择器和一个验证器这是我不理解的时候,这就是文章所说的:
What follows is our proposed strategy for handling “remember me” cookies in a web application without leaking any useful information (even timing information) to an attacker,while still being fast and efficient (to prevent denial of service attacks).
Our proposed strategy deviates from the above simple token-based automatic login system in one crucial way: Instead of only storing a random
token
in a cookie,we storeselector:validator
.
selector
is a unique ID to facilitate database look-ups,while preventing the unavoidable timing information from impacting security. (This is preferable to simply using the databaseid
field,which leaks the number of active users on the application.)07001
On the database side of things,the
validator
is not stored wholesale; instead,the SHA-256 hash ofvalidator
is stored in the database,while the plaintext is stored (with theselector
) in the user’s cookie. With this fail-safe in place,if somehow theauth_tokens
table is leaked,immediate widespread user impersonation is prevented.The automatic login algorithm looks something like:
- Separate
selector
fromvalidator
.- Grab the row in
auth_tokens
for the given selector. If none is found,abort.- Hash the
validator
provided by the user’s cookie with SHA-256.- Compare the SHA-256 hash we generated with the hash stored in the database,using
hash_equals()
.- If step 4 passes,associate the current session with the appropriate user ID.
所以这就是我不明白的地方:
1)选择器和验证器应包含哪些内容?
2)为什么这个系统是安全的以及它如何防止定时泄漏?
在此先感谢,对于长篇文章感到抱歉,但我真的想了解这是如何工作的,我该如何实现它.
我知道我可以使用一些框架或库但我想从scracth制作它,通过反复试验来学习!
Can an attacker change the value of the
$_SESSION['adminId']
? For example,change from 1,to 12 and,therefore,login in as a different admin?
不会.会话数据仅存储在服务器上.客户端只有标识会话的字符串.
I should use cookies for persistent login right?
如果您要进行持久登录,通常就是这样做的.
so the first thing is to never store the user id in a cookie and use that to check for the log in because an attacker can easily change that right?
正确,您永远不会想要暴露任何关键数据,例如用户ID.
1) What should the
selector
andvalidator
contain?
每个都是正确生成的随机字符串(例如,使用openssl_random_pseudo_bytes).选择器必须是唯一的.
2) Why is this system secure and how it prevents timing leaks?
首先,如果您的数据库泄漏给攻击者,他们就无法生成自己记住我的cookie并冒充每个用户.验证器仅作为散列值存储在数据库中. cookie必须包含未散列的值.反转好的哈希是非常耗时的.
其次,比较仅在服务器上生成的哈希可以避免计时攻击.如果攻击者发送各种记住我的cookie值来定时查找,它就不会暴露任何有用的东西,因为服务器上的比较是针对散列值而不是原始值.
一般来说,如果您的系统的安全性非常重要,我建议您不要支持记住我的功能.如果您确实要在重要站点上使用此功能,请使用已经过测试的库以确保安全.