Исправление CSRF на странице aspx

Мне нужно исправление ошибки CSRF для страницы aspx. Код выглядит так:

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 -

<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>
[ ! d3]

Теперь при вставке & lt;% @ Html.AntiForgeryToken ()%> в верхней строке появляется ошибка «Серверный блок не сформирован правильно». Итак, как мне исправить ошибку.

1
задан 13 August 2018 в 15:19

1 ответ

Здесь вы используете веб-формы. У них уже есть анти-xsrf, установленный в шаблоне главной страницы (я думаю, что он заправлен всеми данными в представлении).

До тех пор, пока вы используете основную страницу, t!

Если вы не используете основную страницу, просто создайте свой собственный, используя состояние сеанса, скрытое поле и указатель. Я взял нижеследующее из 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);
0
ответ дан 15 August 2018 в 17:00
  • 1
    Ошибка - имя «antiforgery» не существует в текущем контексте для AntiforgeryChecker.Check (это, antiforgery); – Ankur Rai 13 August 2018 в 16:04
  • 2
    @AnkurRai, вы установили скрытое поле на странице с помощью runat = 'server'? Затем вы сможете ссылаться на него при загрузке страницы – Sean T 13 August 2018 в 16:13
  • 3
    Да, я добавил. Но у меня есть альтернативное решение для добавления атрибута SameSite в config. Это работает и меньше путаницы. – Ankur Rai 14 August 2018 в 10:26
  • 4
    Вы должны просто использовать мастер-страницу честно. Нет смысла пытаться изобретать колесо – Sean T 14 August 2018 в 11:38

Другие вопросы по тегам:

Похожие вопросы: