Как работает AntiForgeryToken - PullRequest
23 голосов
/ 31 января 2011

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

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

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

Ответы [ 2 ]

69 голосов
/ 23 января 2014

Вот хороший учебник по 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, а затем проверяет токен поля зашифрованной формы, расшифровывает значение и проверяет, соответствует ли незашифрованное значение вашему сеансу или идентификатору пользователя или чему-то еще. Если это произойдет, он знает, чтобы продолжить.

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

И вот оно у вас есть. Помешать нигерийским принцам по одному жетону против подделки за раз.

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

6 голосов
/ 31 января 2011

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

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

...