4

如何防止对 asp.net webforms 应用程序中的 ajax 请求的 csrf 攻击

4

2 回答 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"],因为默认情况下更新面板也会发送页面的视图状态 :)

用于 jQuery ajax

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 回答