在CSpx页面中修复CSRF

时间:2018-08-13 12:19:30

标签: asp.net csrf antiforgerytoken

我需要修复aspx页面的CSRF缺陷。代码是这样的-

ASPX-

<asp:Content runat='server'>
<asp:Panel runat='server'>
<table>
  <tr>
    <td>Username</td>
    <td><asp:TextBox runat="server" ID="Username" autocomplete="off"></asp:TextBox></td>
  </tr>
  <tr>
    <td>Password</td>
    <td><asp:TextBox runat="server" ID="Password" TextMode="Password" autocomplete="off"></asp:TextBox></td>
  </tr>
  <tr>
    <asp:Button ID="Submit" runat="server" Text="Submit"
                            OnClick="SubmitButton_Click" CssClass="Resizable" />
  </tr>
</table>
</asp:Panel>
</asp:Content>

ASPX.cs-

protected void SubmitButton_Click(object sender, EventArgs e)
        {
          //Code here
        }

现在,在顶部插入<%@ Html.AntiForgeryToken()%>时抛出错误“服务器块格式不正确”。那么我应该如何进行修复。

1 个答案:

答案 0 :(得分:0)

您在这里使用网络表单。他们已经在母版页模板中设置了anti-xsrf(我认为它已经包含了所有的viewstate数据)。

只要您使用母版页,就不必担心。

如果您不使用母版页,则可以使用会话状态,隐藏字段和GUID来构建自己的母版页。我摘自http://willseitz-code.blogspot.com/2013/06/cross-site-request-forgery-for-web-forms.html

的以下内容

您的隐藏场...

<asp:HiddenField ID="antiforgery" runat="server"/>

执行工作服务器端的代码...

public static class AntiforgeryChecker
{
    public static void Check(Page page, HiddenField antiforgery)
    {
        if (!page.IsPostBack)
        {
            Guid antiforgeryToken = Guid.NewGuid();
            page.Session["AntiforgeryToken"] = antiforgeryToken;
            antiforgery.Value = antiforgeryToken.ToString();
        }
        else
        {
            Guid stored = (Guid) page.Session["AntiforgeryToken"];
            Guid sent = new Guid(antiforgery.Value);

            if (sent != stored)
            {
                throw new SecurityException("XSRF Attack Detected!");
            }
        }
    }
}

最后,在您的Page_Load方法中,以下代码...

AntiforgeryChecker.Check(this, antiforgery);