ASP.net MVC AntiForgeryToken через AJAX - PullRequest
8 голосов
/ 28 августа 2009

В настоящее время я занимаюсь разработкой приложения MVC на ASP.net. Я использую AJAX.ActionLink для предоставления ссылки на удаление в списке записей, однако это очень небезопасно. Я поставил это:

<AcceptVerbs(HttpVerbs.Post)>

Над функцией для удаления, которая останавливает функцию, вызываемую просто по URL. Однако другая дыра в безопасности, которая все еще существует, заключается в том, что если бы я создал простую HTML-страницу с таким содержанием:

<form action="http://foo.com/user/delete/260" method="post">
<input type="submit" />
</form>

Это все равно будет исполнять сообщение, но из другого места.

Можно ли использовать AntiForgeryToken с AJAX ActionLink? Если так, это безопасный подход? Есть ли еще дыры в безопасности, которых я не осознал?

Ответы [ 5 ]

9 голосов
/ 28 августа 2009

Посмотрите на это сообщение в блоге .

Скажем, у вас есть метод действия, например это:

[AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] public ActionResult DeleteAccount(int accountId) { // delete stuff }

И вы звоните через:

$.post('/home/DeleteAccount', { accountId: 1000 }, function() { alert('Account Deleted.'); });

Так как POST не включает AntiForgeryToken, не получится.

К счастью, это не займет много умственные способности, чтобы это исправить. Все клиент боковой компонент AntiForgeryToken делает это положить токен в основной скрытое поле. Итак, вам просто нужно вытащить эти данные и включить их в ваш звонок AJAX.

var token = $('input[name=__RequestVerificationToken]').val();

$.post('/home/DeleteAccount', { accountId: 1000, '__RequestVerificationToken': token }, function() { alert('Account Deleted.'); });

Обратите внимание, что если у вас есть несколько формы на странице с несколькими AntiForgeryTokens, вам придется укажите, какой вы хотите в своем JQuery селектор. Еще одна ошибка, если вы используете jQuery serializeArray() функция, у вас будет добавим немного по-другому:

var formData = $('#myForm').serializeArray(); var token = $('input[name=__RequestVerificationToken]').val(); formData.push({ name: '__RequestVerificationToken', value: token });

$.post('/home/DeleteAccount', formData, function() { alert('Account Deleted.'); });

Обновление: ссылка была исправлена.

6 голосов
/ 11 мая 2013

Использовать AntiForgeryToken с Ajax.ActionLink

В дополнение к jjwhite01 ответ; чтобы вставить токен в данные формы, используйте option.data в Prefilter

$.ajaxPrefilter(
    function (options, localOptions, jqXHR) {
        if (options.type !== "GET") {
            var token = GetAntiForgeryToken();
            if (token !== null) {
                if (options.data.indexOf("X-Requested-With") === -1) {
                    options.data = "X-Requested-With=XMLHttpRequest" + (options.data === "") ? "" : "&" + options.data;
                }
                options.data = options.data + "&" + token.name + '=' + token.value;
            }
        }
    }
);
6 голосов
/ 16 сентября 2012

Вы можете использовать AntiForgeryToken с Ajax.ActionLink, но вам нужно вручную вставить AntiForgeryToken в заголовок вашего запроса следующим образом:

function GetAntiForgeryToken(){
   var tokenWindow = window;
   var tokenName = "__RequestVerificationToken";
   var tokenField = $(tokenWindow.document).find("input[type='hidden'][name='" +     tokenName +   "']");
   if (tokenField.length == 0) {return null;}
   else {
      return {
         name: tokenName,
         value: tokenField.val()
      };
   }
};

Затем мы можем использовать $ .ajaxPrefilter, чтобы вставить его в заголовок:

$.ajaxPrefilter(
   function (options, localOptions, jqXHR) {
      var token = GetAntiForgeryToken();
      jqXHR.setRequestHeader(token.name, token.value);
   }
);

Я написал пост об этом здесь . Надеюсь, это поможет!

2 голосов
/ 01 апреля 2010

Я не знаю конкретно об AJAX ActionLink, но со страницы WebForms можно публиковать в MVC-действие с атрибутами [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken].

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

См. Этот ответ: Использование MVC HtmlHelper из WebForm

0 голосов
/ 28 августа 2009

Я сам не пользовался никакими помощниками ajax, но не вижу причин, по которым вы не можете использовать ссылку. Лично я бы использовал обработчик события onload, чтобы ненавязчиво создать ссылку из самой формы, а затем удалить форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...