使用Html.Action调用[ChildActionOnly]操作方法时的安全问题

时间:2015-03-09 11:56:15

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

我在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: -

  4.   @ Html.Action(“GetChildRecords”,“Customer”,new {customerid =   Model.CustomerID})

2 个答案:

答案 0 :(得分:3)

属性[ChildActionOnly]的本质是确保仅使用ActionRenderAction调用它,并且无法直接从浏览器调用。

对于问题1:如果调用操作已具有[Authorize]属性,则无需担心

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

对于问题3:因为他们无法直接调用该动作,所以我不确定是否需要担心。但是在服务器端始终验证您获得的任何输入(表单,查询字符串等)。

答案 1 :(得分:1)

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

2 - 这是一个子动作,因此无法直接调用

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

关于问题1,我认为授权儿童行动是一种很好的辩护:

  • 今天,可能是所有家长行动都获得授权,但未来会如何。如果另一个开发人员没有意识到这是假设并且在未经授权的新的父母行动中使用子操作会怎样?也许您可以使用代码注释来减少这种情况,但为什么要冒风险呢?
  • 根据应用程序权限模型的复杂程度,父级的授权逻辑可能与子级的授权逻辑不同。同样,今天情况可能并非如此,但可能会在未来。