Chr*_*sic 6 c# asp.net dependency-injection webforms antiforgerytoken
我正在努力提高我公司网站的安全性,并希望创建一个令牌,以防止可以轻松维护的伪造尝试,这就是我想出的.
public class AntiForgeryToken
{
private readonly string _referenceToken;
public AntiForgeryToken()
{
_referenceToken = Guid.NewGuid().ToString();
}
public string ReferenceToken
{
get { return _referenceToken; }
}
}
Run Code Online (Sandbox Code Playgroud)
在我的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
}
Run Code Online (Sandbox Code Playgroud)
我有StructureMap句柄将令牌存储在Session中,所以它是每个用户会话持久化的,所有这些都是AntiForgery方案的有效实现吗?
编辑:我的问题似乎有些混乱,是的我理解ASP.NET MVC有一个内置的AntiForgeryToken方案,这个问题明确是关于如何为WebForms重新创建这个以防止使用CSRF攻击(Cross Site Request Forgery) ).我理解这绝不会消除对用户权限的正确授权的需要.
我打算提出@Neal和@solairaja发布的链接:使用ASP.NET MVC的AntiForgeryToken()帮助程序防止跨站点请求伪造(CSRF).本文解释了CSRF攻击的更多内容以及MVC如何阻止它,但是他们的解决方案不适用于webforms,这就是我实现自己的原因.
在看到来自@Neal的响应后,我认为这很可能是接受的答案,因为我没有意识到我可以从MVC工具中获得实际的源代码,这很可能会取代guid创建.但是,如果其他任何人都有一些有价值的信息需要补充,我会留下问题.
克里斯,
您的方法或多或少模仿了 MVC 中的防伪造方法,只不过它们使用从 RNGCryptoServiceProvider 生成的 base64 编码字节数组并将令牌存储在页面(隐藏表单字段)和 cookie 中。我建议将更多逻辑移至令牌实现中(例如,将大部分验证逻辑封装在令牌内)。
MVC 实现的代码可以在http://aspnet.codeplex.com/sourcecontrol/changeset/view/23011?projectName=aspnet#391757上免费访问,如果可能的话,您应该查看它以及http://blog.codeville .net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/进行分析+想法。
归档时间: |
|
查看次数: |
3759 次 |
最近记录: |