我们有一个ASP.NET MVC应用程序.通过使用@Html.AntiForgeryToken和ValidateAntiForgeryToken属性,所有POST请求(表单提交)都受到CSRF保护.控制器上的一个操作方法是GET,它向用户返回一个报告(一个包含数据库数据的pdf文件).签名是:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetReport()
{
// get data from db
return GetReport();
}
Run Code Online (Sandbox Code Playgroud)
以下是我要针对此操作测试CSRF的步骤:
问题:
这可以被视为CSRF攻击吗?
如果是的话,如何减轻它?由于action方法是GET请求,我如何使用MVC的CSRF方法(应用@Html.AntiForgeryToken和ValidateAntiForgeryToken操作方法).
HTML文件:
<html>
<body>
<form action="https://<baseurl>/Analysis/GetReport">
<input type="submit" value="Submit request" />
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我在我的状态机中定义了以下状态。
"loop":{
"Type": "Pass",
"Result":{
"totalCount": "$.newFieldsResponse.body.count",
"currentCount": 0,
"step": 1
},
"ResultPath": "$.iteration",
"Next":"iterateLoop"
},
Run Code Online (Sandbox Code Playgroud)
我希望状态的输出是:
"newFieldsResponse": {
"isSuccess": true,
"error": "",
"body": {
"count": 2,
"fields": [...]
}
},
"iteration": {
"totalCount": 5,
"currentCount": 0,
"step": 1
}
}
Run Code Online (Sandbox Code Playgroud)
迭代属性被添加到输入中,totalCount 属性被设置为字段数组中的项目数。
但是,“迭代”属性的输出设置为:
"iteration": {
"totalCount": "$.newFieldsResponse.body.count",
"currentCount": 0,
"step": 1
}
Run Code Online (Sandbox Code Playgroud)
看起来值 "$.newFieldsResponse.body.count" 没有得到解析,而是按原样输出。
有什么我做错了吗?有人可以就如何使其工作提出建议吗?