CSRF保护深度

时间:2015-09-24 05:21:12

标签: php security csrf csrf-protection

我目前在我的php应用程序中添加了一个CSRF令牌保护机制。 在我阅读时,唯一的要求是一个唯一的每用户令牌,我在php7中使用random_bytes生成。

我担心的是,如果攻击者使用用户的浏览器发送http请求,浏览器是否会以任何方式发送令牌的会话变量? (因为用户具有与令牌关联的sessionid)。

我将令牌存储在会话变量echo的隐藏值中。

例如:我的令牌存储在会话变量中,然后攻击者将我发送到带有csrf保护的更改密码页面,验证将不会通过? (我的浏览器cookie中已经有正确的会话标识符。)

由于

1 个答案:

答案 0 :(得分:1)

以下是CSRF攻击的工作原理:

Alice(有意或无意)访问compromised.com

compromised.comyoursite.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 policycompromised.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>

†它不一定要发布,但这是常见的