我正在努力提高我公司网站的安全性,并希望创建一个令牌来防止可以轻松维护的伪造尝试,这就是我想出的。
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 攻击(Cross Site Request Forgery )。我理解这绝不会消除对用户权限的适当授权的需要。
我将提出@Neal 和@solairaja 发布的链接:使用 ASP.NET MVC 的 AntiForgeryToken() 帮助程序防止跨站点请求伪造 (CSRF)。本文解释了更多 CSRF 攻击是什么以及 MVC 如何阻止它,但是他们的解决方案不适用于 Web 表单,这就是我开始实施自己的解决方案的原因。
在看到@Neal 的回复后,我认为这很可能是公认的答案,因为我没有意识到我可以从 MVC 工具中获取实际源代码,这很可能会取代 guid 创建。但如果其他人有一些有价值的信息要添加,我会留下这个问题。