Как предотвратить атаку CSRF с данными, которые не сохраняются в БД в ASP.NET с помощью C#?
Я хочу предотвратить атаку межсайтового скрипта и блокировать данные без сохранения в БД. Я генерирую токен CSRF изначально с GUID, а затем, если в нем есть файл cookie запроса, мы передаем это значение. Также данные могут быть сохранены в базе данных. Я использую Visual Studio 2017, и то же самое было размещено. Проверка проводится на страницу init и до событий загрузки.
Что я уже пробовал:
Ниже приведен мой код:
#region Code for adding anti-csrf token private const string AntiXsrfTokenKey = "__AntiXsrfToken"; private const string AntiXsrfUserNameKey = "__AntiXsrfUserName"; private string _antiXsrfTokenValue; protected void Page_Init(object sender, EventArgs e) { try { Common.WriteDDSLog("Entered Master Page Init"); NeSTBLL.Common.ChangeStyle(Page); if (!IsPostBack) { Session["CSRF"] = null; } else { if (Request.UrlReferrer == null) { //throw new InvalidOperationException("Validation of Anti-XSRF token failed."); Response.Redirect("~/CustomErrorPage.aspx", false); } } // 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; Common.WriteDDSLog("Anti XSRF Token Value 1" + _antiXsrfTokenValue); Page.ViewStateUserKey = _antiXsrfTokenValue; Common.WriteDDSLog("ViewState User Key 1" + Page.ViewStateUserKey); } else { // Generate a new Anti-XSRF token and save to the cookie _antiXsrfTokenValue = Guid.NewGuid().ToString("N"); Common.WriteDDSLog("Anti XSRF Token Value 2" + _antiXsrfTokenValue); Page.ViewStateUserKey = _antiXsrfTokenValue; Common.WriteDDSLog("ViewState User Key 2" + Page.ViewStateUserKey); 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; //int AbsoluteURL = Request.UrlReferrer.PathAndQuery.ToString().Length; //int URL_REF = Request.UrlReferrer.ToString().Length; //string URLREF = Request.UrlReferrer.ToString().Substring(0, URL_REF - AbsoluteURL).ToString(); //Common.WriteDDSLog("Session URLREF : " + Session["URL_REF"].ToString()); //Common.WriteDDSLog("URLREF1 : " + URLREF); //if (Session["URL_REF"].ToString() != URLREF) //{ // Response.Redirect("~/CustomError.aspx", false); //} } catch (Exception ex) { FormsAuthentication.SignOut(); Session.Abandon(); Session.Clear(); Response.Clear(); try { //Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddYears(-30); //Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddDays(-30); //Delete the cookie } catch { } HttpContext.Current.Response.Redirect("http://", true); } Common.WriteDDSLog("Completed Master Page Init"); } protected void master_Page_PreLoad(object sender, EventArgs e) { try { Common.WriteDDSLog("Entered Master Page Pre Load"); if (!IsPostBack) { // Set Anti-XSRF token ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey; Common.WriteDDSLog("ViewState Token Key" + ViewState[AntiXsrfTokenKey]); ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty; Common.WriteDDSLog("ViewState User Name Key" + ViewState[AntiXsrfUserNameKey]); } 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."); Common.WriteDDSLog("Validation of Anti-XSRF token failed in Page Pre Load."); Response.Redirect("~/CustomErrorPage.aspx", false); } } } catch (Exception ex) { FormsAuthentication.SignOut(); Session.Abandon(); Session.Clear(); Response.Clear(); try { //Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddYears(-30); //Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddDays(-30); //Delete the cookie } catch { } HttpContext.Current.Response.Redirect("http://", true); } Common.WriteDDSLog("Completed Master Page Pre Load"); }