C# 防止跨站点请求伪造
我了解并在web上找到了大量的博客和文章来处理它,但没有一个像样的链接,没有一个有用的解决方案来处理asp.net web应用程序中的CSRF攻击。我在我的网站上运行了一个,它报告了跨网站请求伪造并显示了风险 有可能窃取或操纵客户会话和cookie,这些会话和cookie可能用于模拟合法用户,从而允许 黑客可以查看或更改用户记录,并以该用户身份执行交易C# 防止跨站点请求伪造,c#,asp.net,security,cookies,cross-site,C#,Asp.net,Security,Cookies,Cross Site,我了解并在web上找到了大量的博客和文章来处理它,但没有一个像样的链接,没有一个有用的解决方案来处理asp.net web应用程序中的CSRF攻击。我在我的网站上运行了一个,它报告了跨网站请求伪造并显示了风险 有可能窃取或操纵客户会话和cookie,这些会话和cookie可能用于模拟合法用户,从而允许 黑客可以查看或更改用户记录,并以该用户身份执行交易 我的问题是如何处理ASP.NET web应用程序中的CSRF攻击?如果您查看发布的第二个链接,就会看到MVC中Html.AntiForgeryT
我的问题是如何处理ASP.NET web应用程序中的CSRF攻击?如果您查看发布的第二个链接,就会看到MVC中
Html.AntiForgeryToken()验证的逻辑:
void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = "";
string formToken = "";
IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}
void ValidateRequestHeader(HttpRequestMessage请求)
{
字符串cookieToken=“”;
字符串formToken=“”;
IEnumerable标记头;
if(request.Headers.TryGetValues(“RequestVerificationToken”,out-tokenHeaders))
{
string[]tokens=tokenHeaders.First().Split(“:”);
if(tokens.Length==2)
{
cookieToken=tokens[0]。Trim();
formToken=tokens[1].Trim();
}
}
防伪。验证(cookieToken,formToken);
}
在web表单应用程序中执行同样的操作应该不会那么困难
请参阅答案以获得可能的解决方案。如果您查看发布的第二个链接,您将看到MVC中Html.AntiForgeryToken()
验证的逻辑:
void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = "";
string formToken = "";
IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}
void ValidateRequestHeader(HttpRequestMessage请求)
{
字符串cookieToken=“”;
字符串formToken=“”;
IEnumerable标记头;
if(request.Headers.TryGetValues(“RequestVerificationToken”,out-tokenHeaders))
{
string[]tokens=tokenHeaders.First().Split(“:”);
if(tokens.Length==2)
{
cookieToken=tokens[0]。Trim();
formToken=tokens[1].Trim();
}
}
防伪。验证(cookieToken,formToken);
}
在web表单应用程序中执行同样的操作应该不会那么困难
有关可能的解决方案,请参阅答案。在web表单应用程序中
ASP.NET提供了一个选项来维护您的ViewState。视图状态
指示页面提交到服务器时的状态。这个
状态是通过在每个页面上放置一个隐藏字段来定义的
控制Viewstate可用作CSRF
防御,因为攻击者很难伪造有效的
视图状态。伪造有效的Viewstate并非不可能,因为它是
参数值可由用户获取或猜测的可行性
攻击者。但是,如果将当前会话ID添加到
ViewState,然后使每个ViewState都是唯一的,因此不受
CSRF
关于CSRF的其他问题:
有可能窃取或操纵客户会话和cookie,这些会话和cookie可能用于模拟合法用户,允许黑客查看或更改用户记录,并作为该用户执行交易
CSRF攻击通常不允许攻击者查看任何内容,只允许攻击者代表登录用户发出请求。但是,如果存在不需要提交当前密码的更改密码选项,则攻击者可以使用受害者会话调用此函数,以便攻击者稍后直接以受害者用户身份登录。在web表单应用程序中
ASP.NET提供了一个选项来维护您的ViewState。视图状态
指示页面提交到服务器时的状态。这个
状态是通过在每个页面上放置一个隐藏字段来定义的
控制Viewstate可用作CSRF
防御,因为攻击者很难伪造有效的
视图状态。伪造有效的Viewstate并非不可能,因为它是
参数值可由用户获取或猜测的可行性
攻击者。但是,如果将当前会话ID添加到
ViewState,然后使每个ViewState都是唯一的,因此不受
CSRF
关于CSRF的其他问题:
有可能窃取或操纵客户会话和cookie,这些会话和cookie可能用于模拟合法用户,允许黑客查看或更改用户记录,并作为该用户执行交易
CSRF攻击通常不允许攻击者查看任何内容,只允许攻击者代表登录用户发出请求。但是,如果存在不需要提交当前密码的更改密码选项,攻击者可能能够使用受害者会话调用此函数,以便攻击者稍后以受害者用户的身份直接登录。在Asp.net Web表单应用程序中是否有任何解决方案可以在Global.asax
中处理此问题
在MVC中,它变得非常简单,但如果旧应用程序是简单的web表单,并且希望在全局级别防止此类攻击,那么解决方案是什么。在Asp.net web表单应用程序中,是否有任何解决方案可以在global.asax
中处理
在MVC中,它变得非常简单,但如果旧的应用程序是简单的web表单,并且希望在全局级别防止此类攻击,那么解决方案是什么呢