ValidateAntiForgeryToken в приложении WebForms - PullRequest
0 голосов
/ 13 сентября 2018

Я читал об использовании ValidateAntiForgeryToken для предотвращения атак XSRF / CSRF. Однако то, что я видел, похоже, относится только к MVC.

Вот статьи, которые я видел:

ValidateAntiForgeryToken цель, объяснение и пример

CSRF и AntiForgeryToken

Предотвращение XSRF / CSRF в ASP.NET MVC и веб-страницах

Как я могу реализовать это или нечто подобное в приложении WebForms?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Используя WebForms, лучше всего использовать ViewStateUserKey .

Вот как это сделать ...

void Page_Init(object sender, EventArgs args)
{    
    ViewStateUserKey = (string)(Session["SessionID"] = Session.SessionID);
}

Кажется странным сохранять SessionID в переменной сеанса, но это необходимо, потому что он автоматически генерирует новый идентификатор, когда он пуст.

0 голосов
/ 16 сентября 2018

Я нашел эту статью Как исправить подделку межсайтовых запросов (CSRF) с помощью Microsoft .Net ViewStateUserKey и Double Submit Cookie со следующим информационным кодом и инструкциями:

Начиная с Visual Studio 2012, Microsoft добавила встроенную защиту CSRF в новые проекты приложений веб-форм. Чтобы использовать этот код, добавьте новое приложение ASP .NET Web Forms в свое решение и просмотрите код Site.Master за страницей. Это решение будет применять защиту CSRF ко всем страницам контента, которые наследуются от страницы Site.Master.

Для работы этого решения должны быть выполнены следующие требования:

• Все веб-формы, вносящие изменения в данные, должны использовать Site.Master стр.

• Все запросы, вносящие изменения в данные, должны использовать ViewState.

• Веб-сайт должен быть свободен от всех межсайтовых сценариев (XSS) уязвимости. См. , как исправить межсайтовый скриптинг (XSS), используя Microsoft .Net Web Protection Library для подробностей.

public partial class SiteMaster : MasterPage
{
private const string AntiXsrfTokenKey = "__AntiXsrfToken";
private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
private string _antiXsrfTokenValue;

protected void Page_Init(object sender, EventArgs e)
{
    //First, check for the existence of the Anti-XSS cookie
    var requestCookie = Request.Cookies[AntiXsrfTokenKey];
    Guid requestCookieGuidValue;

    //If the CSRF cookie is found, parse the token from the cookie.
    //Then, set the global page variable and view state user
    //key. The global variable will be used to validate that it matches in the view state form field in the Page.PreLoad
    //method.
    if (requestCookie != null
    && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
    {
        //Set the global token variable so the cookie value can be
        //validated against the value in the view state form field in
        //the Page.PreLoad method.
        _antiXsrfTokenValue = requestCookie.Value;

        //Set the view state user key, which will be validated by the
        //framework during each request
        Page.ViewStateUserKey = _antiXsrfTokenValue;
    }
    //If the CSRF cookie is not found, then this is a new session.
    else
    {
        //Generate a new Anti-XSRF token
        _antiXsrfTokenValue = Guid.NewGuid().ToString("N");

        //Set the view state user key, which will be validated by the
        //framework during each request
        Page.ViewStateUserKey = _antiXsrfTokenValue;

        //Create the non-persistent CSRF cookie
        var responseCookie = new HttpCookie(AntiXsrfTokenKey)
        {
            //Set the HttpOnly property to prevent the cookie from
            //being accessed by client side script
            HttpOnly = true,

            //Add the Anti-XSRF token to the cookie value
            Value = _antiXsrfTokenValue
        };

        //If we are using SSL, the cookie should be set to secure to
        //prevent it from being sent over HTTP connections
        if (FormsAuthentication.RequireSSL &&
        Request.IsSecureConnection)
        responseCookie.Secure = true;

        //Add the CSRF cookie to the response
        Response.Cookies.Set(responseCookie);
    }

        Page.PreLoad += master_Page_PreLoad;
    }

    protected void master_Page_PreLoad(object sender, EventArgs e)
    {
        //During the initial page load, add the Anti-XSRF token and user
        //name to the ViewState
        if (!IsPostBack)
        {
            //Set Anti-XSRF token
            ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;

            //If a user name is assigned, set the user name
            ViewState[AntiXsrfUserNameKey] =
            Context.User.Identity.Name ?? String.Empty;
        }
        //During all subsequent post backs to the page, the token value from
        //the cookie should be validated against the token in the view state
        //form field. Additionally user name should be compared to the
        //authenticated users name
        else
        {
            //Validate the Anti-XSRF token
            if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
            || (string)ViewState[AntiXsrfUserNameKey] !=
            (Context.User.Identity.Name ?? String.Empty))
        {
        throw new InvalidOperationException("Validation of
        Anti-XSRF token failed.");
        }
    }
}

}

0 голосов
/ 14 сентября 2018

CSRF-атаки не являются исключительными для приложения MVC, веб-формы также уязвимы.

По сути, CSRF-атака использует доверие, которое сайт оказывает браузеру пользователя, запрашивая или публикуя информацию на сайте, как правило, через скрытые формы или JavaScript XMLHttpRequests на вредоносном веб-сайте, когда пользователь использует файлы cookie, хранящиеся в браузере.

Чтобы предотвратить эту атаку, вам понадобится токен защиты от подделки, уникальный токен, отправленный в ваших формах, который необходимо проверить, прежде чем доверять информации формы.

Вы можете найти подробное объяснение здесь .

Чтобы защитить приложения веб-форм от 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);
    ...
}

MyMaster.Master:

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

Надеюсь, вы найдете это полезным.

...