Как защитить мои вызовы JsonResult GET? - PullRequest
5 голосов
/ 17 февраля 2009

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

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

Например, мой View содержит вызов onSubmit jQuery, например:

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

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

EDIT:

Я нашел этот пост о похожем вопросе, без конкретного ответа.

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

Ответы [ 4 ]

8 голосов
/ 17 февраля 2009

Вы можете использовать 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- для своего действия.

Надеюсь, это поможет

1 голос
/ 10 февраля 2012

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

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

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); }
    }
1 голос
/ 17 февраля 2009

Прежде всего, почему бы не использовать $ .post (url, data, callback, 'json') вместо getJSON? И, как сказал kleolb02, вы можете добавить значение из файла cookie к данным публикации, используя плагин cookie - {__RequestVerificationToken: $ .cookie ('__ RequestVerificationToken')}

0 голосов
/ 17 февраля 2009

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

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

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

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

...