2009-02-16 21 views
5

Я знаю, как использовать атрибут AntForgeryToken MVC и связанный с ним HTML-помощник, чтобы помочь XSRF-защитить POST-форму моего приложения.Как защитить мои вызовы GET JsonResult?

Можно ли что-то подобное сделать для JsonResults, которые реализуют GET?

Например, на мой взгляд, содержит вызов onSubmit JQuery, как, например:

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) { 
    if(data.Allow) { 
    //Do something. 
    } 
}); 

Я хочу, чтобы убедиться, что это JsonResult только вызываемая из предполагаемой страницы.

EDIT:

Я нашел this post о подобном вопросе, без конкретного ответа.

Что является самым простым способом обеспечить, чтобы мой GET (неразрушающий) URL-адрес потреблялся только вызовом AJAX с моей собственной страницы?

ответ

8

Вы можете использовать AntiForgeryToken в сочетании с некоторой пользовательской логикой. Создание токена AntiForgery на сервере одинаковое, но по умолчанию это значение не включено в ваш XmlHttpRequest.

Значение этого токена находится в файле cookie HTTP «__RequestVerificationToken» и также должно быть в форме данных, отправленных на сервер. Так включают пару ключ/значение в вашей XmlHttpRequest и использовать ValidateAntiForgeryToken - атрибут на контроллере

EDIT:

Сегодня я попытался с помощью AntiForgeryToken для Ajax просит себя и она отлично работает. Просто используйте следующий JavaScript:

$.post('my_url', $.getAntiForgeryTokenString(), function() { ... }); 

$.getAntiForgeryTokenString = function() { 
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize(); 
}; 

На стороне сервера вы не должны изменить свой код - просто используйте атрибут ValidateAntiForgeryToken- для действия.

Надеется, что это помогает

+0

Как интегрировать значение __RequestVerificationToken с $ .getJSON или $ .ajax вызов? Помните, что это запрос GET. –

+0

Прочтите «Раскрытие токена по URL» с http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet «Если на действия на стороне сервера гарантируются ответы только на запросы POST, нет необходимости включать токен в запросы GET «Ключ должен убедиться, что ваш GET не изменяет данные. В противном случае вам не нужно защищать запросы GET. –

0

Вы можете сделать что-то похожее на методы анти XSRF. Просто сгенерируйте некоторый ID, вставьте его в javascript, и когда пользователь называет ваш JSON-url, укажите этот url сгенерированный идентификатор и проверьте, есть ли он.

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

Некоторые хэш на основе сеанса и времени могут сделать трюк. Если пользователь копирует значение из JS, он все равно может выполнить его из другого места, но вы можете получить это значение за каждые x минут. Другой вариант - установить cookie с JS и прочитать его на сервере.

Надеюсь, это даст вам несколько идей, чтобы вы начали.

1

Прежде всего, почему бы не использовать $ .post (URL, данные, обратный вызов, 'JSON') вместо getJSON? И как сказал kleolb02, вы можете добавить значение из куки в почтовых данных с использованием cookie plugin - {__RequestVerificationToken: $ .cookie («__ RequestVerificationToken»)}

+0

Звучит неплохо. Я надеялся избежать POST для такого простого вызова ajax, но я, конечно, буду, если это единственный способ его защитить. –

+0

Вы должны использовать сообщение для обновления некоторых данных на сервере. Это общий сценарий. И насколько я помню, AntiForgeryToken работает только с почтовыми запросами (они ищут значение только в FormCollection). – zihotki

+0

Это не обновление, это просто «получить». Я просто хотел бы ограничить потребление URL-адресами на вызовы AJAX моей собственной страницы. –

1

Я использовал подобный код в проекте ASP.NET MVC использовать на функцию размытия элемента без формы Ajax. Этот код обеспечивает заполнение текстового поля данными сервера при возникновении определенного события Blur элемента HTML.

Надеюсь, это тоже поможет. Вот мой код:

Javascript:

var mytext = { 'myText': 'example text' }; 
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) { 
     $('#htmlElement').val(resultData); 
}); 
AddAntiForgeryToken = function (data) { 
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val(); 
    return data; 
}; 

C-Sharp Код:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public JsonResult SeoString(string myText) 
    { 
     try 
     { 
      // do something here 
      return this.Json("result text"); 
     } 
     catch (Exception) 
     { return this.Json(string.Empty); } 
    }