【问题标题】:Security concerns when using Html.Action to call [ChildActionOnly] action method使用 Html.Action 调用 [ChildActionOnly] 操作方法时的安全问题
【发布时间】:2015-03-09 11:56:15
【问题描述】:

我在 asp.net mvc5 中有以下操作方法,我将其定义为 ChildActionOnly:-

[ChildActionOnly]
public ActionResult GetChildRecords(int customerid)

在我看来,我将其称为如下:-

<div>@Html.Action("GetChildRecords", "Customer", new {customerid = Model.CustomerID})</div>

但我有以下问题:-

  1. 我需要在子操作方法之前添加 [Authorize] 注释吗?或者我可以确定,因为它的父级被授权,所以子操作方法也将被授权?

  2. 用户或黑客可以直接调用 ChildActionOnly 吗?

  3. 用户或黑客是否可以修改 Html.Action 参数?例如在下面的 html 中传递不同的 customerid:-

@Html.Action("GetChildRecords", "Customer", new {customerid = 模型.客户 ID})

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-5 authorize-attribute actionmethod


    【解决方案1】:

    属性[ChildActionOnly]的本质是保证它只能使用ActionRenderAction调用,不能直接从浏览器调用。

    对于问题1:如果调用action已经有[Authorize]属性,不用担心

    对于问题 2:黑客(或任何人)无法直接访问它。

    对于问题 3:由于他们不能直接调用该操作,我不确定它有什么可担心的。但始终在服务器端验证您获得的任何输入(表单、查询字符串等)。

    【讨论】:

    • 感谢您的回复,但我意识到我没有处理的事情是,我的操作方法正在使用 ajax 请求调用,并且似乎用 [ChildActionOnly] 装饰我的操作方法会不允许ajax调用它。所以现在我很困惑,因为我需要使用 ajax 请求或使用 Html.Action 调用我的操作方法,但同时防止用户或黑客直接调用它?如果有办法解决这个问题,你能建议吗?
    • @johnG 您可以删除[ChildActionOnly] 并使用[Authorize] 装饰动作。并且在操作中检查该客户登录是否有权检查他提供的 customerId .. 或者您可以为此使用过滤器。
    【解决方案2】:

    我同意@scartag 对问题 2 和 3 的回答:

    2 - 它是一个子动作,所以不能直接调用

    3 - 攻击者无法干预以修改传递给子操作的参数,因此在父操作中进行初始验证就足够了。但是,这可能会导致封装不佳,因为子操作的某些逻辑可能会泄漏到父操作中。

    关于问题 1,我认为授权子行为是一个很好的纵深防御:

    • 今天,可能是所有父操作都已授权,但将来会怎样。如果另一个开发人员没有意识到这是假设的,而是在新的、未经授权的父操作上使用子操作怎么办?也许您可以使用代码 cmets 来减少这种情况的发生,但为什么要冒险呢?
    • 根据应用程序权限模型的复杂性,父级的授权逻辑可能与子级的不同。同样,今天可能不是这样,但将来可能会这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多