我知道如何使用MVC的AntiForgeryToken属性及其相关的HTML帮助程序来帮助XSRF保护我的应用程序的表单POST。
可以为实现GET的JsonResults做类似的事情吗?
例如,我的View包含一个onSubmit jQuery调用,如:
$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) {
if(data.Allow) {
//Do something.
}
});
我想确定这个JsonResult只能从目标页面调用。
编辑:
我发现了this post关于类似问题,没有具体答案。
确保我的GET(非破坏性)URL仅由我自己的页面中的AJAX调用消费的最简单方法是什么?
答案 0 :(得分:8)
您可以将AntiForgeryToken与某些自定义逻辑结合使用。在服务器上创建AntiForgery令牌是相同的,但默认情况下,该值不包含在您的XmlHttpRequest中。
此令牌的值位于仅HTTP的cookie“__RequestVerificationToken”中,并且还应该是发布到服务器的表单数据。因此,在XmlHttpRequest中包含一个键/值对,并在控制器上使用ValidateAntiForgeryToken - 属性
编辑:
今天我尝试自己使用AntiForgeryToken进行Ajax请求,它运行正常。只需使用以下javascript:
$.post('my_url', $.getAntiForgeryTokenString(), function() { ... });
$.getAntiForgeryTokenString = function() {
return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize();
};
在服务器端,您不必更改代码 - 只需使用ValidateAntiForgeryToken-属性即可。
希望这有帮助
答案 1 :(得分:1)
首先,为什么不使用$ .post(url,data,callback,'json')而不是getJSON? 正如kleolb02所说,您可以使用cookie plugin - {__ RequestVerificationToken:$ .cookie('__ RequestVerificationToken')}
将Cookie中的值添加到帖子数据中答案 2 :(得分:1)
我在ASP.NET MVC项目中使用了类似的代码,在没有Ajax表单的情况下使用元素的模糊函数。当某个HTML元素模糊事件发生时,此代码提供填充文本字段和服务器数据。
希望这也有帮助。这是我的代码:
使用Javascript:
var mytext = { 'myText': 'example text' };
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) {
$('#htmlElement').val(resultData);
});
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
return data;
};
C-Sharp代码:
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult SeoString(string myText)
{
try
{
// do something here
return this.Json("result text");
}
catch (Exception)
{ return this.Json(string.Empty); }
}
答案 3 :(得分:0)
您可以执行类似于反XSRF方法的操作。只需生成一些ID就可以将其插入到javascript中,当用户调用你的JSON url时,让该url包含生成的ID并检查它是否存在。
对XSRF的防御也使用sessionID作为密钥,但这并不会阻止用户从其他网站为自己的帐户执行它。
基于会话和时间的一些哈希可能会起作用。当然,如果用户从JS复制值,他仍然可以从另一个位置执行它,但是你可以让该值每x分钟到期一次。另一个选择是使用JS设置cookie并在服务器端读取它。
希望这能为您提供一些让您入门的建议。