在asp.net Web表单中防止对ajax请求的crf攻击

时间:2013-09-30 16:01:35

标签: asp.net webforms asp.net-ajax csrf

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

2 个答案:

答案 0 :(得分:5)

您可以创建一个令牌并将其保存在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"],因为默认情况下更新面板也会发送Page的viewstate:)

for 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);
}
});

答案 1 :(得分:1)

您应该看一下这个链接:Preventing Cross-Site Request Forgery (CSRF) Attacks

简而言之:反伪造令牌,作为ASP.NET MVC框架的一部分提供。既然你使用的是webforms,它可能会有点复杂,但是有一个ASP.NET网站可以同时运行webforms和MVC(或者看看这个已回答的问题:AntiForgery implementation in Asp.net Forms)。

编辑:另外,为了保护jQuery调用,您可以使用反伪造令牌并将其打印到客户端(如here所述:

var csrf_token = '<%= token_value %>';
$("body").bind("ajaxSend", function(elm, xhr, s){
   if (s.type == "POST") {
      xhr.setRequestHeader('X-CSRF-Token', csrf_token);
   }
});