【问题标题】:Secure ASP.NET MVC calls to controllers保护对控制器的 ASP.NET MVC 调用
【发布时间】:2012-01-21 01:38:27
【问题描述】:

快速提问;

给控制器 User 和 and 函数 Get 有人可以调用;

mydomain.com/user/get 并访问那里的功能。

只有我的应用程序才能调用它的最佳做法是什么?

谢谢

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 model-view-controller


    【解决方案1】:

    使用 [ChildActionOnly] 属性装饰动作方法将确保控制器上的动作方法不能被用户输入 URL 直接调用。 EG

     [ChildActionOnly]
            public ActionResult _CantNavigateHere()
            {
                return View();
            }  
    

    【讨论】:

    • 嗨柔道,如果调用是从控制器完成的,它就可以工作。我使用 $.ajax 从 jQuery 调用一些控制器功能,当我这样做时,如果控制器操作按照您的建议进行装饰,我会返回 500 错误。我怎样才能从 jquery 调用这个动作并且仍然像这样装饰它?
    • 对于 ajax 场景,您需要实现 [AjaxOnly] 属性,这里有一个简单的演示 helios.ca/2009/05/27/…
    • 但这是否意味着任何人都可以使用 ajax 来调用它?
    • 这有点像 hack,但是理论上可以使用 Ajax 调用它。这些过滤器更多地用于关注点分离和一致性而不是安全性。如果访问控制器存在安全问题,则控制器可能暴露太多。也许发布更多您的代码。
    • 好吧,假设我有一个名为 Save 的控制器和一个名为 Transaction 的操作,并且我向该操作传递了几个字符串参数;我正在使用 jQuery ajax ($.ajax) 回发到服务器,这是当今非常常见的情况;我相信必须有一种方法来保护它,只允许 mu 应用程序使用该功能,不是吗?
    【解决方案2】:

    您可以将 AntiForgeryToken 与 MVC3 和 Ajax 一起使用。

    我就是这样做的。 (这当然不是万无一失的,但增加了另一层安全性)

    在你的视野中,任何地方,输出:

    @Html.AntiForgeryToken()
    

    并且在您的 Ajax 调用中将此值包含在 post 变量中,例如:

    $.post("/Controller/Action/",
                    { 'id': var_id, '__RequestVerificationToken': $("input[name='__RequestVerificationToken']").val() }, 
                    function (data) { /* handle request */ });
    

    在你的控制器中:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Action(int id) {..}
    

    除此之外,您还可以检查引用主机并拒绝任何与您的域不匹配的主机。这可以被欺骗,但同样,这只是要添加的另一层。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 2010-10-31
      • 1970-01-01
      • 2023-03-28
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多