2015-06-08 1 views
4

Имеет смысл только, что этот фильтр по умолчанию (то есть по лесу) применяется к действию a Login, насколько мне известно, этот токен работает лучше всего, когда уже связан с идентификатором входа. С ним применяется к Login, у меня есть проблема, если пользователь пытается войти в два раза, с ошибкой, например, какНужно ли мне действие ValidateAntiForgeryToken в действии входа?

Предоставленные против подделки маркеров были предназначены для пользователя «», но в настоящее время пользователя " [theLoggedInUser]».

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

+1

Это произошло в моих приложениях, когда пользователь дважды нажимает кнопку «Вход». Что я сделал, я отключил кнопку при первом щелчке ... Проблема исчезла! –

+1

У нас была такая же ошибка в нашей форме входа, прежде всего, когда пользователь вошел в систему, нажал кнопку «Назад», а затем попытался снова войти в систему. Наше решение заключалось в том, чтобы не кэшировать страницу входа в систему, добавив к методу действия входа атрибут [OutputCache (NoStore = true, Location = OutputCacheLocation.None)]. –

ответ

2

Да, вы должны использовать его. Используя куки-файл и значение скрытой формы, которое оно вставляет, оно помогает предотвратить подделку злоумышленников на ваш сайт и злонамеренные запросы POST.

Это, конечно, будет, когда ypu проверит ваши данные учетной записи пользователя. Без него кто-то мог написать сценарий для принудительной атаки сервера, пытаясь угадать логин пользователя и пароль. Используя функцию проверки подлинности с подтверждением, каждый запрос гарантируется сбой, даже если скрипт генерирует правильный пароль.

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

EDIT: Обновлено на основе комментария, но точка все еще стоит. Используйте его;)

+1

Собственно, если злоумышленник может просто угадать учетные данные пользователя с помощью методов грубой силы (или любого другого метода), у злоумышленника уже есть ключи от королевства без выполнения атаки CSRF. Таким образом, анти-поддельные жетоны не помешают такому нападению. Тем не менее, есть все еще веские причины использовать токены для подделки в формах регистрации, как описано здесь: http://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not Необходимый-нужный – Nimrand

+0

Вы уверены? Я отредактировал мой ответ, чтобы быть в безопасности, но если хакер (очень плохой) продолжал рассылать вредоносное действие сервера на сервер с помощью вредоносных запросов - скажем, в командной строке, все они должны терпеть неудачу из-за отсутствия токен анти-подделки. Теперь, если этот хакер должен был написать сценарий, который с каждой попыткой переместил бы новую страницу входа через окно браузера, это было бы по-другому (и значительно сложнее сделать). –

+0

На самом деле, токен анти-подделки легко получить ... он предоставляется вам каждый раз, когда вы запрашиваете страницу входа (или другую страницу, защищенную токеном). Если я хочу, чтобы сценарий взлома входа в систему, который запускается с моего собственного компьютера, все, что мне нужно сделать, это написать программу для запроса страницы входа в систему, проанализировать токен из HTML и затем отправить мой запрос на вход с токеном. Однако JavaScript НЕ МОЖЕТ загружать страницы с других сайтов, поэтому он не может получить доступ к токену. Таким образом, токен защищает от атак с межсайтовой атакой, но не против прямых грубых атак или любой другой прямой атаки. – Nimrand

0

Я не думаю, что есть причина использовать токен анти-подделки для форм, для которых не требуется аутентификация. Причина этого заключается в том, что AFT предназначен для предотвращения подделок подпроцесса, где какой-то вредоносный код использует вашего уже зарегистрированного пользователя для выполнения несанкционированных запросов на какой-либо сайт от вашего имени. Таким образом, публикация как «вашего» анонимного пользователя может быть выполнена даже без приветствия вашего запроса. Я вижу довольно неплохой сценарий, когда черная шляпа хочет использовать чужой IP-адрес для публикации, но это не кажется слишком реалистичным.

Если я ошибаюсь в этом вопросе, пожалуйста, просветите меня, поэтому я тоже могу узнать что-то новое и лучшее из моих путей.

+1

Я думал то же самое. Но тогда я прочитал это: http://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not-required-needed – Nimrand

0

Я думаю, вы знаете Почему использовать анти-подделку, поэтому я размещаю здесь несколько советов и решений.

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

Есть много людей, которые дважды щелкают по всему - это нехорошо! Вы можете удалить атрибут проверки, пока ваш сайт будет Включен SSL.В любом случае, решения для решения могут быть:

  1. Отключение кнопки отправки (с JS) после щелчка
  2. Создать частичный вид только с @Html.AntiForgeryToken() и после входа в систему, сделать другой запрос AJAX обновить анти-подделку лексема с ответом на просьбу
  3. Отключение проверки идентификации для анти-подделки путем добавления AntiForgeryConfig.SuppressIdentityHeuristicChecks = true к вашему Application_Start метод
0

Вы можете использовать, но если вы проверяете, что операции были сделаны дважды или более, вы меняете свою перспективу с анти-подделки на спам. Дважды или более действия можно классифицировать как спам-события. Если вы хотите предотвратить это, напишите какой-нибудь код;

public class PreventSpamAttribute : ActionFilterAttribute 
{ 
    //This stores the time between Requests (in seconds) 
    public int DelayRequest = 10; 
    //The Error Message that will be displayed in case of excessive Requests 
    public string ErrorMessage = "Excessive Request Attempts Detected."; 
    public string ErrorResouceKey = string.Empty; 
    //This will store the URL to Redirect errors to 
    public string RedirectUrl; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //Store our HttpContext (for easier reference and code brevity) 
     var request = filterContext.HttpContext.Request; 
     //Store our HttpContext.Cache (for easier reference and code brevity) 
     var cache = filterContext.HttpContext.Cache; 

     //Grab the IP Address from the originating Request (very simple implementation for example purposes) 
     var originationInfo = request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? request.UserHostAddress; 

     //Append the User Agent 
     originationInfo += request.UserAgent; 

     //Now we just need the target URL Information 
     var targetInfo = request.RawUrl + request.QueryString; 

     //Generate a hash for your strings (this appends each of the bytes of the value into a single hashed string 
     var hashValue = string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(originationInfo + targetInfo)).Select(s => s.ToString("x2"))); 

     //Checks if the hashed value is contained in the Cache (indicating a repeat request) 
     if (cache[hashValue] != null) 
     { 
      //!!!!!!!!!!!!!!!!!!!!!! ATTENTION !!!!!!!!!!!!!!!! 
      //Adds the Error Message to the Model and Redirect 

      //or 

      //Force the action to do anythning!!!!! 

      // My business Solution : 
      //if (!string.IsNullOrEmpty(ErrorResouceKey)) //if error will getting from resouce 
      //{ 
      // throw new BusinessException(ResourceHelper.Current.GetKeyValue(ErrorResouceKey)); 
      //} 

      //throw new BusinessException(ErrorMessage); 
     } 
     //Adds an empty object to the cache using the hashValue to a key (This sets the expiration that will determine 
     //if the Request is valid or not 
     //cache.Add(hashValue, null, null, DateTime.Now.AddSeconds(DelayRequest), Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 

     cache.Add(hashValue, 1, null, DateTime.Now.AddSeconds(DelayRequest), Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 
     base.OnActionExecuting(filterContext); 
    } 
} 

При использовании (вы можете изменить стратегию обработки ошибок);

[PreventSpam(DelayRequest = 5, ErrorMessage = "Please try again in 5 seconds.")] 
    public virtual JsonResult Login() 
    { 
    } 
+0

Хороший совет, спасибо. – ProfK

Смежные вопросы