【问题标题】:kendoui grid in mvc3 security vulnerability, how do i get around it?mvc3 安全漏洞中的 kendoui 网格,我该如何解决?
【发布时间】:2012-07-16 21:37:09
【问题描述】:

kendoUI 网格使用 HttpGet 请求在 AJAX 请求期间更新数据。 (http://www.kendoui.c​​om/documentation/asp-net-mvc/helpers/grid/ajax-binding.aspx) 服务器返回一个Json结果,为了让它工作,我们需要使用以下代码:

return Json(Result, JsonRequestBehavior.AllowGet);

这很好,但它是一个安全漏洞(这就是微软让我们把“AllowGet”放在那里的原因)。

返回 Json 的安全方法是在 HttpPost 中,但 kendoui 网格不允许这样做。

我想使用 kendoui 网格。有没有办法使用HttpGet,返回Json,并且安全地做到这一点?

谢谢!

【问题讨论】:

    标签: json asp.net-mvc-3 security kendo-ui


    【解决方案1】:

    如果您使用的是 Kendo Grid 的 MVC 包装器,则不会发生这种情况。由于这种 ASP.NET MVC 行为,网格被配置为发出 POST 请求。不过,请确保您已包含 kendo.aspnetmvc.min.js。更多信息可以在docs找到。

    【讨论】:

    • 我已经包含了 kendo.aspnetmvc.min.js。当我用 [HttpPost] 装饰我的动作时,网格不再更新。仅当 Action 是 [HttpGet] 时才会更新。你能告诉我他们在文档中谈论这个的地方吗?在我在问题中提供的链接中,他们说它将执行 HttpGet 请求。从未提及 HttpPost。
    • 找到了。你完全正确。我的脚本源中有一个拼写错误。谢谢!
    • 不过,如果您通过 AJAX 加载 JSON 数据,请注意 Kendo Dropdownlist 存在此漏洞。您必须执行以下操作以强制下拉列表使用 POST: .DataSource(s => s.Read(a => a.Action(DatasourceAction, DatasourceController).Type(HttpVerbs.Post))
    【解决方案2】:

    kendo 数据源在使用 ajax 时默认使用 GET,但可以通过定义传输设置来使用 POST。

    这是Telerik kendo CRUD example 使用帖子的代码的缩短版本。

    <script>
        $(function () {
            $("#grid").kendoGrid({
                toolbar: ["create", "save", "cancel"],
                dataSource: {
                    schema: {
                        model: {
                            id: "ProductID",
                            fields: {
                                ProductID: { editable: false, nullable: true },
                                ProductName: { validation: { required: true } },
                                UnitPrice: { type: "number", validation: { required: true } }
                            }
                        }
                    },
                    transport: {
                        create: {
                            url: "Products.svc/Create", 
                            contentType: "application/json; charset=utf-8", 
                            type: "POST" 
                        },
                        read: {
                            url: "Products.svc/Read",
                            contentType: "application/json; charset=utf-8",
                            type: "POST"
                        },
                        parameterMap: function(data, operation) {
                            if (operation != "read") {
                                return JSON.stringify({ products: data.models })
                            }
                        }
                    }
                }
            });
        });
    </script>
    

    【讨论】:

    • 我知道你可以在哪里使用类型:“POST”,但我在 MVC 中看不到等效项。我试过'Datasource().Read().Type("Post")',但是没有".Type()"也没有"Datasource().Transport()"
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多