【问题标题】:Manually set cookie value to disable Anti-forgery Token?手动设置 cookie 值以禁用防伪令牌?
【发布时间】:2018-02-04 23:18:33
【问题描述】:

我仍然不明白防伪令牌在 MVC 中是如何工作的。 来自MSDN

防伪令牌

为帮助防止 CSRF 攻击,ASP.NET MVC 使用防伪令牌,也称为请求验证令牌。

  1. 客户端请求一个包含表单的 HTML 页面。
  2. 服务器在响应中包含两个令牌。一个令牌作为 cookie 发送。另一个放置在隐藏的表单域中。令牌是随机生成的,因此对手无法猜测值。
  3. 当客户端提交表单时,它必须将两个令牌都发送回服务器。客户端将 cookie 令牌作为 cookie 发送,并在表单数据中发送表单令牌。 (当用户提交表单时,浏览器客户端会自动执行此操作。)
  4. 如果请求不包含两个令牌,服务器将拒绝该请求。

下面是一个带有隐藏表单标记的 HTML 表单示例:

<form action="/Home/Test" method="post">
<input name="__RequestVerificationToken" type="hidden"   
       value="6fGBtLZmVBZ59oUad1Fr33BuPxANKY9q3Srr5y[...]" />    
<input type="submit" value="Submit" />

我的问题是,因为我们可以通过查看源代码(在任何浏览器中按 F12)轻松找到隐藏的令牌值。然后我们可以通过转到开发人员工具(Ctrl-Shift-J 或工具 -> 开发人员工具)-> 控制台手动设置 cookie,然后您可以输入 javascript 命令:

document.cookie="keyofcookie=valueofcookie"?

然后我们手动将令牌设置为相同,从而禁用防伪技术?

【问题讨论】:

    标签: asp.net asp.net-mvc cookies


    【解决方案1】:

    该 cookie 是 HttpOnly 并且不能从 javascript 设置,因为所有最新的浏览器都实现了 HttpOnly。此外,cookie 令牌和表单令牌都包含不同的 base 64 加密信息。解密将是服务器端的东西。

    此外,这些标记不进行相等性比较。它们在数据方面相互补充。另外,您没有阅读完整的文章。 MVC 也有自己的方法来验证令牌..

    检查下面的链接是否有帮助。

    https://www.codeproject.com/Articles/793384/ASP-NET-Anti-Forgery-Tokens-internals

    【讨论】:

    【解决方案2】:

    正如documentation 所说:

    防伪令牌有效,因为恶意页面无法读取 由于同源策略,用户的令牌。 (Same-origin policies 防止托管在两个不同站点上的文档访问每个站点 别人的内容。所以在前面的例子中,恶意页面可以 向 example.com 发送请求,但它无法读取响应。)

    这意味着,由于上述政策,复制 cookie 值并将其使用到任何其他位置都将不起作用。

    【讨论】:

    • 我还是没看懂the malicious page cannot read the user's tokens,这句话。您的意思是我们无法通过脚本var x = document.cookie; 读取cookie?
    猜你喜欢
    • 2020-04-27
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2021-10-30
    • 2015-01-11
    • 2018-01-05
    相关资源
    最近更新 更多