Skip to main content
 首页 » 编程设计

c#之WebForms 应用程序中的 ValidateAntiForgeryToken

2024年02月04日29yjmyzz

我阅读了一些有关使用 ValidateAntiForgeryToken 来防止 XSRF/CSRF 攻击的文章。然而,我所看到的似乎只与 MVC 有关。

这些是我看过的文章:

ValidateAntiForgeryToken purpose, explanation and example

CSRF and AntiForgeryToken

XSRF/CSRF Prevention in ASP.NET MVC and Web Pages

如何在 WebForms 应用程序中实现这个或类似的东西?

请您参考如下方法:

CSRF 攻击并不仅仅针对 MVC 应用程序,Web 表单也很容易受到攻击。

基本上,CSRF 攻击利用网站在用户浏览器中的信任,通过请求或向网站发布信息,通常是通过恶意网站中的隐藏表单或 JavaScript XMLHttpRequests,就像用户使用存储在浏览器中的 cookie 一样。

为防止这种攻击,您需要一个防伪 token ,一个在您的表单中发送的唯一 token ,您需要在信任表单信息之前对其进行验证。

可以找到详细的解释here .

为了保护您的 webforms 应用程序免受 CSRF 攻击(它在我的项目中有效),是在您的母版页中实现它,如下所示:

添加将为您处理 CSRF 验证的新类:

public class CsrfHandler 
{ 
    public static void Validate(Page page, HiddenField forgeryToken) 
    { 
        if (!page.IsPostBack) 
        { 
            Guid antiforgeryToken = Guid.NewGuid(); 
            page.Session["AntiforgeryToken"] = antiforgeryToken; 
            forgeryToken.Value = antiforgeryToken.ToString(); 
        } 
        else 
        { 
            Guid stored = (Guid)page.Session["AntiforgeryToken"]; 
            Guid sent = new Guid(forgeryToken.Value); 
            if (sent != stored) 
            { 
                // you can throw an exception, in my case I'm just logging the user out 
                page.Session.Abandon(); 
                page.Response.Redirect("~/Default.aspx"); 
            } 
        } 
    } 
} 

然后在您的母版页中实现:

MyMasterPage.Master.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    CsrfHandler.Validate(this.Page, forgeryToken); 
    ... 
} 

我的大师.大师:

<form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
    <asp:HiddenField ID="forgeryToken" runat="server"/> 
    ... 
</form> 

希望您会发现这很有用。