我在机器 A 上使用 localhost 在 IIS 上托管了一个小型 MVC 应用程序。我的主页中有以下 html。这里的域名是B机的IP地址,用于测试目的。
<div class="row">
<div class="col-md-4">
<h2 class="jumbotron">You have won a prize!</h2>
<p>
To redeem your prize. Click this button.
</p>
<form action="http://target_IP_address/eline/webController/Populate" method="POST">
<input type="hidden" name="dateF" value="3/16/2022 3:01:26 PM" />
<input type="hidden" name="dateT" value="3/17/2022 3:01:26 PM" />
<input type="submit" class="btn btn-primary btn-lg" value="Give me my prize" />
</form>
</div>
</div>
现在,在机器 B 中,我登录到了存在漏洞的网站。然后,我单击一个链接,转到计算机 A 上托管的网站。当我到达该网站时,我单击
"submit"
按钮。这就是我的困惑开始的地方。机器 B 中没有发出此请求的记录。我确实在机器 A 中看到了该请求。这是我看到的。
我的印象是我会在机器 B 上看到该请求。因为我在机器 A 上看到了它,所以我确信我搞砸了。如果
response
缺少另一个自定义标头(csrf-token:一些唯一令牌),我实现的用于检查 csrf 攻击的修复应该将自定义标头(csrf-Detected:1)附加到 request
。由于此标头没有显示在“响应标头”部分中,因此我认为检查没有发生在 Populate
中的 webController
方法之前。谁能指出我做错了什么?
从 Microsoft 网站查看此页面。
为了帮助防止 CSRF 攻击,ASP.NET MVC 使用防伪造令牌, 也称为请求验证令牌。
- 客户端请求包含表单的 HTML 页面。
- 服务器在响应中包含两个令牌。一个令牌作为 cookie 发送。另一个放置在隐藏的表单字段中。代币 是随机生成的,因此对手无法猜测这些值。
- 当客户端提交表单时,它必须将两个令牌发送回服务器。客户端将 cookie 令牌作为 cookie 发送,并且它 发送表单数据内的表单令牌。 (浏览器客户端 当用户提交表单时自动执行此操作。)
- 如果请求不包含两个令牌,服务器将不允许该请求。
要将防伪令牌添加到 Razor 页面,请使用 HtmlHelper.AntiForgeryToken 辅助方法:
@using (Html.BeginForm("Manage", "Account")) { @Html.AntiForgeryToken() }
此方法添加隐藏表单字段并设置 cookie 令牌。