【发布时间】:2010-12-14 17:04:20
【问题描述】:
我正在努力提高我公司网站的安全性,并希望创建一个令牌以防止可以轻松维护的伪造尝试,这就是我想出的。
public class AntiForgeryToken
{
private readonly string _referenceToken;
public AntiForgeryToken()
{
_referenceToken = Guid.NewGuid().ToString();
}
public string ReferenceToken
{
get { return _referenceToken; }
}
}
在我的 MasterPage 基类中,我有一个 HiddenField,其属性名为:ReferenceToken
protected virtual void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
InjectToken();
}
ValidateToken();
}
private void InjectToken()
{
var token = ObjectFactory.GetInstance<AntiForgeryToken>();
ReferenceToken = token.ReferenceToken;
}
private void ValidateToken()
{
var token = ObjectFactory.GetInstance<AntiForgeryToken>();
if (ReferenceToken.Equals(token.ReferenceToken, SC.InvariantCultureIgnoreCase))
return;
...do stuff for failed token
}
我有 StructureMap 句柄将令牌存储在 Session 中,因此它会在每个用户会话中持久保存,所有这些都是 AntiForgery 方案的有效实现吗?
编辑: 我的问题似乎有些混乱,是的,我知道 ASP.NET MVC 有一个内置的 AntiForgeryToken 方案,这个问题明确地是关于如何为 WebForms 重新创建它 以防止使用 CSRF 攻击(跨站点请求伪造)。我理解这绝不会消除对用户权限进行适当授权的需要。
我将提出@Neal 和@solairaja 发布的链接:Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken() helper。本文解释了更多 CSRF 攻击是什么以及 MVC 如何阻止它,但是他们的解决方案不适用于 Web 表单,这就是我开始实施自己的解决方案的原因。
在看到@Neal 的回复后,我认为这很可能是公认的答案,因为我没有意识到我可以从 MVC 工具中获取实际源代码,这很可能会取代 guid 创建。但如果其他人有一些有价值的信息要补充,我会留下这个问题。
【问题讨论】:
-
我想在 WebForms 页面中使用 MVC 令牌 - 即从 WebForm 发布到 MVC 并仍然验证。看到这个答案:stackoverflow.com/questions/1347728/…
标签: c# asp.net webforms dependency-injection antiforgerytoken