prévention des attaques par falsification de requêtes intersite (csrf) asp.net formulaires web

j'ai créé un ASP.Net demande de formulaire Web à L'aide de Visual Studio 2013 et j'utilise Dot Net Frame Work 4.5, et je veux m'assurer que mon site est sécurisé contre la falsification de requêtes intersite (CSRF), j'ai trouvé de nombreux articles parlant de la façon dont cette fonctionnalité est mise en œuvre sur les applications MVC, mais un très petit nombre parlant de formulaires web, StackOverflow question un commentaire indiquant que

"C'est une vieille question, mais la plus récente de Visual Studio 2012 ASP.NET le modèle pour les formulaires web inclut le code anti-FCRR gravé dans le master page. Si vous n'avez pas les modèles, voici le code générer.:.."

mais mon maître page ne contient pas le code qu'il a mentionné dans sa réponse, donc quelqu'un peut-il m'aider? est-il vraiment mis en œuvre? si non, veuillez indiquer quelle est la meilleure façon de le faire?

15
demandé sur Mohamed Badr 2015-04-29 12:28:17

4 réponses

Vous pouvez essayer la. Dans le formulaire Web ajouter:

<%= System.Web.Helpers.AntiForgery.GetHtml() %>

ajouter un champ caché et un cookie. Donc, si vous remplissez certaines données de formulaire et de le poster sur le serveur vous avez besoin d'une vérification simple:

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
 AntiForgery.Validate();
}

AntiForgery.Validate(); lance une exception si la vérification anti XSFR échoue.

20
répondu Saftpresse99 2016-03-22 11:25:19

Viewstatuserkey & Double Submit Cookie

à partir de Visual Studio 2012, Microsoft a ajouté une protection CSRF intégrée aux nouveaux projets d'application de formulaires web. Pour utiliser ce code, ajoutez une nouvelle application de formulaires Web ASP .NET à votre solution et visualisez le Site.Code maître derrière la page. Cette solution appliquera la protection CSRF à toutes les pages de contenu héritées du Site.Page maître.

Les conditions suivantes doivent être remplies pour que cette solution travail:

tous les formulaires Web faisant des modifications de données doivent utiliser le Site.Page maître. Toutes les demandes de modification de données doivent utiliser ViewState. Le site Web doit être exempt de toute vulnérabilité de type Cross-Site Scripting (XSS). Pour plus de détails, voir comment corriger le script Cross-Site (XSS) en utilisant la bibliothèque de protection Web Microsoft .Net.

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.");
      }
    }
  }
}
12
répondu Nada N. Hantouli 2017-02-24 11:04:15

lorsque vous créez un nouveau projet de 'formulaire Web' dans VS 2013, le site.maître.cs inclura automatiquement le code XSRF / CSRF dans le Page_Init section de la classe. Si vous ne recevez pas le code généré, vous pouvez manuellement Copy+ Paste le code. Si vous êtes à l'aide de C#, puis utilisez le ci-dessous:-

private const string AntiXsrfTokenKey = "__AntiXsrfToken";
private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
private string _antiXsrfTokenValue;

 protected void Page_Init(object sender, EventArgs e)
    {
        // The code below helps to protect against XSRF attacks
        var requestCookie = Request.Cookies[AntiXsrfTokenKey];
        Guid requestCookieGuidValue;
        if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
        {
            // Use the Anti-XSRF token from the cookie
            _antiXsrfTokenValue = requestCookie.Value;
            Page.ViewStateUserKey = _antiXsrfTokenValue;
        }
        else
        {
            // Generate a new Anti-XSRF token and save to the cookie
            _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
            Page.ViewStateUserKey = _antiXsrfTokenValue;

            var responseCookie = new HttpCookie(AntiXsrfTokenKey)
            {
                HttpOnly = true,
                Value = _antiXsrfTokenValue
            };
            if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
            {
                responseCookie.Secure = true;
            }
            Response.Cookies.Set(responseCookie);
        }

        Page.PreLoad += master_Page_PreLoad;
    }

    protected void master_Page_PreLoad(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Set Anti-XSRF token
            ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
            ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty;
        }
        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.");
            }
        }
    }
7
répondu Mahesh Kava 2015-04-30 08:25:35

Vous pouvez utiliser le code ci-dessous, qui vérifiera la requête d'où elle vient

if ((context.Request.UrlReferrer == null || context.Request.Url.Host != context.Request.UrlReferrer.Host)) 
    {
        context.Response.Redirect("~/error.aspx", false);
    }

Il fonctionne très bien pour moi!!!

-4
répondu Bell 2017-01-26 20:04:14