为什么CSRF token应该在meta标签和cookie中?

问题描述 投票:0回答:4
security cookies csrf meta-tags
4个回答
32
投票

为了防止 CSRF,您需要随请求提交一个值,该值不能由恶意站点发送。身份验证 cookie 不适合,因为如果攻击者可以使浏览器向受害站点发送请求,则 cookie 将自动提交。

例如,通过

www.evil.com
上包含的JavaScript提交表单来攻击
www.example.com
上的用户会话:

<form method="post" action="https://www.example.com/executeAction">
    <input type="hidden" name="action" value="deleteAllUsers">
</form>

<script>document.forms[0].submit()</script>

在页面内存储反 CRSF 令牌是 OWASP 推荐的防止其他网站提交表单的解决方案,因为由于

同源策略
阻止 JavaScript,www.evil.com 无法读取用户会话中的随机令牌在
www.evil.com
阅读
www.example.com
的页面内容。

这些令牌可以存储在页面内的任何位置。最常见的是,它位于隐藏的表单字段中,但它们也可以存储在HTML 5数据属性中。看起来使用

meta
标签只是另一种存储方式,JavaScript 可以将其包含在页面提交的任何表单中。


13
投票

CSRF 令牌通常作为隐藏表单字段出现在表单中。仅当您使用 JavaScript 时,将它们放入元标记中才有意义。 JavaScript 可以从元标记中读取令牌并将其发布到操作中。

您不想将 CSRF 令牌放入 Cookie 中,因为无论其来源如何,都会针对从 Web 浏览器向特定网站发出的每个请求发送 Cookie。唯一的例外是安全 cookies,它应该遵循同源策略。


5
投票

这是因为没有什么可以阻止违规网站将数据发布到合法网站,其中可能包括您的身份验证票证和 CSRF 令牌。想象一下这个场景...取自 ASP.NET

  1. 用户使用表单身份验证登录 www.siteA.com。
  2. 服务器对用户进行身份验证。服务器的响应包含身份验证 cookie。
  3. 用户如果不注销,就会访问恶意网站。该恶意网站包含以下 HTML 表单:

    <h1>You Are a Winner!</h1>
        <form action="http://siteA.com/api/account" method="post">
            <input type="hidden" name="Transaction" value="withdraw" />
            <input type="hidden" name="Amount" value="1000000" />
     <input type="submit" value="Click Me"/>
        </form>
    

请注意,表单操作会发布到易受攻击的网站,而不是恶意网站。这就是CSRF的“跨站”部分。

用户单击提交按钮。浏览器在请求中包含身份验证 cookie。 该请求在具有用户身份验证上下文的服务器上运行,并且可以执行允许经过身份验证的用户执行的任何操作。

基本上,当 siteA.com 收到 CSRF 攻击时,它应该将 cookie 中的 CSRF 令牌与元标记中的 CSRF 令牌进行匹配。合法请求将包括两者,但是,伪造攻击将仅包括 cookie 中指定的 CSRF 令牌。


1
投票

我能想到的唯一选择是让这些数据可以通过 JavaScript 访问。当然,以防 cookie 仅是 http。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.