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