Подтвердить что ты не робот

Как работает AntiForgeryToken

Я пытаюсь защитить от CSRF и имею два сценария:

  • Выполнение POST с другого сайта и сбой при включении AntiForgeryToken
  • Я попытался использовать свой "вредоносный" Javascript (работает на другом сайте), чтобы сначала сделать GET страницы, проанализировать ее и извлечь RequestVerificationToken, а затем выполнить POST. Это также терпит неудачу, но мне непонятно почему?

Может кто-нибудь объяснить, почему?

4b9b3361

Ответ 1

Из соображений безопасности вы не можете получать контент из другого домена с помощью AJAX.

Поэтому другие сайты не могут получить ваш токен.

Ответ 2

Вот хороший учебник по CSRF:

http://youtu.be/vrjgD0azkCw

Вот общий смысл: вы вошли на свой банковский сайт. Ваш банк кладет cookie на ваш компьютер, чтобы он мог аутентифицировать вас. Каждый раз, когда вы делаете запрос (т.е. Загружаете страницу с) yourbank.com, браузер отправляет файл cookie на веб-сервер, а код на веб-сервере проверяет файл cookie, чтобы убедиться, что вы аутентифицированы. Отлично.

Однако, пока файл cookie еще не истек, вы проверяете свою почту и открываете письмо от нигерийского принца, предлагая вам нажать ссылку. Вы нажимаете на него (кто может сопротивляться), и вместо того, чтобы привести вас к странице, о которой рассказал Принц, ссылка приведет вас к этому URL-адресу:

http://yourbank.com/transfer.aspx?amt=1000000&from=myAccount&to=princeAccount

Поскольку вы уже прошли проверку подлинности в своем банке (через файл cookie), он думает, что вы действительно просите перевести деньги, чтобы он это сделал.

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

Итак, теперь, отвечая на ваш конкретный вопрос:

Один из способов борьбы с этим (используемый Ruby и .NET и другими) заключается в том, чтобы включить маркер анти-подделки. В основном, когда вы запрашиваете страницу, сервер включает скрытое поле с зашифрованным значением. И когда вы отправляете форму, веб-сайт просматривает файл cookie, чтобы убедиться, что вы аутентифицированы, но также просматривает зашифрованное значение, которое отправляет браузер, и убедитесь, что оно действительно. Зашифрованный токен реалистично будет идентификатором сеанса, к которому привязана ваша учетная запись. Таким образом, сервер видит файл cookie, идентифицирует вас как пользователь 123, а затем проверяет маркер поля зашифрованной формы, расшифровывает значение и гарантирует, что незашифрованное значение соответствует вашей сессии или идентификатору пользователя или чему-то еще. Если это так, он знает, что нужно продолжить.

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

И у вас это есть. Преодоление нигерийских князей одним анти-поддельным токеном за раз.

(Ничего против Нигерии или нигерийцев здесь. Я уверен, что они прекрасные люди. Просто их принцы иногда ведут себя немного плохо.):)