如何防止对 asp.net webforms 应用程序中的 ajax 请求的 csrf 攻击
问问题
2747 次
2 回答
8
您可以创建一个令牌并将其保存在 Session["CSRF"] 中,并在每个页面的 HiddenField 中呈现相同的内容。
protected HiddenField CSRF { get; set; }
protected void page_load(object s, args[] e) {
if(Session["CSRF"]!=null) {
this.CSRF=Session["CSRF"];
}
else {
Session["CSRF"]=Guid.NewGuid().ToString();
this.CSRF=Session["CSRF"];
}
}
因此,每当您发送请求时,将其添加为数据参数并在服务器端代码中进行检查。
为每个请求传递这个 CSRF HiddenField id。
对于 ASP.Net Ajax 调用,您可以使用ViewState["CSRF"]
,因为默认情况下更新面板也会发送页面的视图状态 :)
var csrf_token = '<%= csrf_value %>';
以下代码将为所有 ajax 请求添加此令牌
$("body").bind("ajaxSend", function(elm, xhr, s){
if (s.type == "POST") {
xhr.setRequestHeader('X-CSRF-Token', csrf_token);
}
});
于 2013-09-30T16:14:07.140 回答
1
你应该看看这个链接:防止跨站点请求伪造(CSRF)攻击
简而言之:防伪令牌,作为 ASP.NET MVC 框架的一部分提供。但是,由于您使用的是 webforms,它可能会稍微复杂一些,但可以让 ASP.NET 网站同时运行 webforms 和 MVC(或查看这个已回答的问题:AntiForgery implementation in Asp.net Forms)。
编辑:另外,为了保护 jQuery 调用,您可以使用防伪令牌并在客户端打印它(如此处所述:
var csrf_token = '<%= token_value %>';
$("body").bind("ajaxSend", function(elm, xhr, s){
if (s.type == "POST") {
xhr.setRequestHeader('X-CSRF-Token', csrf_token);
}
});
于 2013-09-30T16:04:46.357 回答