ranio Ответов: 1

Как предотвратить атаку 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");
  }

1 Ответов

Рейтинг:
1

dnxit

Если вы создадите новый проект приложения веб-формы в VS 2013, site.master.cs будет включать код XSRF/CSRF в раздел Page_Init класса. Это выглядит так


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