MVC3 Удаленная проверка и AntiForgeryToken - PullRequest
3 голосов
/ 18 июля 2011

После прочтения о XSS-атаках я применил AntiForgeryToken к моему веб-сайту с помощью атрибута ValidateAntiForgeryTokenWrapper, описанного в этой статье:

http://weblogs.asp.net/dixin/archive/2010/05/22/anti-forgery-request-recipes-for-asp-net-mvc-and-ajax.aspx

Кажется, это работает хорошо, однако я столкнулся с проблемой при использовании удаленной проверки в MVC3. У меня есть ValidationController, который содержит все общие проверки на моем сайте, и если я применяю к нему ValidateAntiForgeryTokenWrapperAttribute, то удаленная проверка больше не работает, и я получаю «Необходимый токен против подделки не был предоставлен или был недействительным» исключение вошел в Elmah. Я попытался отладить это, и он даже не попал в действие контроллера, прежде чем выдать исключение. Я предполагаю, что это происходит из-за того, что удаленная проверка не знает, как передать AntiForgeryToken контроллеру - кто-нибудь еще имел эту проблему или знает, не предназначены ли эти два для совместного использования?

Это также заставило меня задуматься о том, должен ли я использовать ValidateAntiForgeryTokenWrapperAttribute на каждом контроллере или нет, какие-либо мысли?

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

В атрибуте remote выполните следующие действия:

[Remote("MyValidationMethod","MyController", HttpMethod = "POST", AdditionalFields = "__RequestVerificationToken")]
public object MyField { get; set; }

свойство AdditionalFields может принимать имена полей через запятую в форме; __RequestVerificationToken - это имя скрытого поля, содержащего AntiForgeryToken.

0 голосов
/ 21 июля 2011

Я не использовал удаленную проверку. Однако у меня был похожий опыт работы с AntiForgeryToken. Когда я его применил ко всем действиям в моем контроллере. Позже я удалил его из всех действий и применил только к тем действиям, которые отправляли данные обратно в базу данных (вставка / обновление / удаление).

Поскольку кажется, что вы применили атрибут проверки AntiForgeryToken ко всему контроллеру, он всегда будет создавать новое значение токена при каждом выполнении действия, поэтому, когда ответ возвращается клиенту для действия удаленной проверки, значение токена отличается от находится в форме, которая будет отправлена ​​позже для других действий.

Вы можете удалить атрибут AntiForgeryToken из контроллера и использовать его с другими действиями, кроме действия удаленной проверки или там, где вам это действительно нужно.

//Instead of this
[ValidateAntiForgeryToken]
public class mycontroller
{
//...
}    

//Do something like this
public class mycontroller
{    
    public ActionResult myotheraction () 
    { }

    [ValidateAntiForgeryToken]
    public ActionResult valdaitionaction () 
    { }
}
...