使用ajax post时如何处理CSRF攻击?

发布于 2024-12-05 16:58:44 字数 1211 浏览 1 评论 0原文

我基本上想制作一个ajax帖子来发送一些stateId并从该州返回一些城市列表。

<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 的常规帖子一样安全。 谢谢。

I basically want to make an ajax post to send some stateId and get back some list of cities from that state.

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

I do the request like this:

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>');
                }
            }
        });
    }

The action is something like this

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

What should i put instead of [1] and [2] so it can work? I basically want this ajax post to be as secure as a regular post with AntiForgeryToken() and ValidateAntiForgeryToken.
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暗地喜欢 2024-12-12 16:58:44

你几乎就在那里:

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)

You were almost there:

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>');
            }
        }
    });
}

and then:

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

this obviously supposes that you use a view model (which by the way you should always use) and:

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

or if you don't want to use view models (against my recommendation) make sure you provide a proper name to this weakly typed helper:

@Html.DropDownList("stateId", (SelectList)ViewBag.States)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文