#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 и убедиться, что вы отправляете данные формы.