Как справиться с CSRF-атаками при использовании ajax post? - PullRequest
0 голосов
/ 20 сентября 2011

Я в основном хочу сделать ajax-пост, чтобы отправить некоторый штатный идентификатор и получить список городов из этого штата.

<form id="frmAjax" action="#">
    @Html.DropDownList("states", (SelectList)ViewBag.States)
    @Html.AntiForgeryToken()
</form>

Я делаю запрос так:

function PopulateTable() {
        var x=$("#frmAjax").serialize();
        $.ajax({
            url: '@Url.Action("GetCities")',
            type: 'POST',
            dataType: 'json',
            data: [1]
            success: function (data) {
                var target = $(".displayData tbody");
                target.empty();
                for (var i = 0; i < data.length; i++) {
                    target.append('<tr><td>' + data[i].Id + '</td><td>' + data[i].Name + '</td><td>' + data[i].Population+ '</td></tr>');
                }
            }
        });
    }

Акция примерно такая

    [ValidateAntiForgeryToken]
    public JsonResult GetCities([2])
    {
        var cities= new Service().GetCities(stateId);
        return Json(classes);
    }

Что я должен поставить вместо [1] и [2], чтобы он мог работать? Я в основном хочу, чтобы этот пост Ajax был таким же безопасным, как и обычный пост с AntiForgeryToken () и ValidateAntiForgeryToken. Благодаря.

1 Ответ

1 голос
/ 20 сентября 2011

Вы были почти там:

function PopulateTable() {
    $.ajax({
        url: '@Url.Action("GetCities")',
        type: 'POST',
        dataType: 'json',
        data: $("#frmAjax").serialize(),
        success: function (data) {
            var target = $(".displayData tbody");
            target.empty();
            for (var i = 0; i < data.length; i++) {
                target.append('<tr><td>' + data[i].Id + '</td><td>' + data[i].Name + '</td><td>' + data[i].Population+ '</td></tr>');
            }
        }
    });
}

, а затем:

[ValidateAntiForgeryToken]
[HttpPost]
public JsonResult GetCities(int stateId)
{
    var cities = new Service().GetCities(stateId);
    return Json(cities);
}

это, очевидно, предполагает, что вы используете модель представления (которую, кстати, всегда следует использовать) и:

@Html.DropDownListFor(x => x.StateId, Model.States)

или если вы не хотите использовать модели представлений (вопреки моей рекомендации), убедитесь, что вы указали правильное имя для этого слабо типизированного помощника:

@Html.DropDownList("stateId", (SelectList)ViewBag.States)
...