CSRF保护深入


CSRF protection in depth

我目前在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,但这很常见