我目前在php应用程序中添加了一个CSRF令牌保护机制。正如我所读的,唯一的要求是一个唯一的每个用户令牌,我在php7中使用random_bytes生成。
我担心的是,如果攻击者使用用户的浏览器发送http请求,浏览器不会以任何方式发送令牌的会话变量吗?(因为用户具有与令牌相关联的sessionid)。我将令牌存储在会话变量回显的隐藏值中。
例如:我的令牌存储在会话变量中,然后攻击者将我发送到具有csrf保护的更改密码页面,验证将不通过?(我已经有正确的会话标识符在我的浏览器cookie)。
谢谢
下面是CSRF攻击的工作原理:
Alice(有意或无意)访问compromised.com
compromised.com
发出HTTP post†请求yoursite.com
,使用HTML表单,或JavaScript,或Flash或任何可以使HTTP post请求。
<form method=post action="http://yoursite.com/change-password">
<input name=password value=666>
<input name=confirm_password value=666>
</form>
这是有效的,因为web浏览器将发送Alice的yoursite.com
会话cookie到yoursite.com
。
由于同源策略,compromised.com
可以向任何站点发送任何想要的数据,但是不能从其他站点读取数据。
以下是CSRF保护的工作原理:
yoursite.com
需要一个名为_csrf_token
(或类似的)的HTTP post请求变量,并将其与您在服务器端会话内存中为Alice存储的内容进行比较。
您将_csrf_token
的值写入HTML表单中的隐藏输入,因此它会自动与来自yoursite.com
的表单帖子一起发送
compromised.com
由于同源策略,无法从yoursite.com
中读取 _csrf_token
的值,因此其尝试向yoursite.com
发布将失败。
<form method=post action="http://yoursite.com/change-password">
<input name=password value=666>
<input name=confirm_password value=666>
<input name=_csrf_token value="???">
</form>
匕首;不一定是post,但这很常见