首页 文章

CSRF保护深度

提问于
浏览
0

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

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

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

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

谢谢

1 回答

  • 1

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

    爱丽丝(有意或无意)访问 compromised.com

    compromised.com 使用HTML表单,JavaScript或Flash或任何可以发出HTTP发布请求的内容向 yoursite.com 发出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 .

    由于Same-origin policycompromised.com can send 它想要任何网站的任何数据,但来自其他网站的数据是 cannot read .

    以下是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>
    

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

相关问题