Использование AntiCSRF с ajax

#c# #asp.net #jquery #csrf

#c# #asp.net #jquery #csrf

Вопрос:

Я установил HttpModule AntiCSRF, но мне нужно использовать его с ajax.
Имя поля токена: RaiseException .
Имя файла cookie: __CSRFCOOKIE .
Должен ли я отправить значение поля токена вручную с помощью ajax POST или нужно сделать что-то еще?
И поскольку мы используем здесь cookie, не может ли кто-нибудь создать cookie с тем же именем и тем же значением и отправить значение, которое отображается в скрытом файле, на сервер и получить данные, или на это есть какие-то ограничения?!
Спасибо

Ответ №1:

Я не знаком с конкретным модулем защиты от CSRF, который вы используете. Поддержка защиты от CSRF встроена в ASP.Net , но он борется с AJAX.

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

Атака CSRF работает, потому что хакеру не нужно видеть файлы cookie, поскольку браузер пользователя отправит их вместе с любым запросом на ваш сайт. Итак, хакер создает форму, которая отправляет данные на ваш сайт:

 <form action="yoursite.com/userAdmin/Create">
    <input type="text" name="username" value="hackerUser" />
    <input type="text" name="rights" value="godlike" />
    ...
</form>
  

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

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

Итак, реализация .Net по умолчанию добавляет файл cookie с токеном, тот же токен в скрытом вводе, а затем проверяет, совпадают ли они. Хакер не может видеть cookie, поэтому не может воспроизвести скрытый ввод.

Это проблема для вызовов AJAX по двум причинам:

  • .Net генерирует токен как скрытый входной тег, что означает, что для его передачи в вызов AJAX требуется некоторый Javascript.
  • Проверка .Net на токен предполагает, что это ввод из формы, что означает, что вызовы JSON передают его в неправильном формате.

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