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?
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.
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.");
}
}
}
}
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.");
}
}
}
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!!!