【问题标题】:How to handle CSRF attacks when using ajax post?使用ajax post时如何处理CSRF攻击?
【发布时间】:2011-09-20 16:39:36
【问题描述】:

我基本上想发一个 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 的常规帖子一样安全。 谢谢。

【问题讨论】:

    标签: .net asp.net asp.net-mvc-3 csrf


    【解决方案1】:

    你快到了:

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2023-03-10
      • 1970-01-01
      • 2011-01-13
      • 2020-02-15
      • 2013-05-08
      • 2020-05-27
      • 2013-04-29
      • 2013-05-06
      相关资源
      最近更新 更多