如何在asp.net webforms应用程序中阻止对ajax请求的csrf攻击
答案 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:)
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);
}
});