Проблемы безопасности при использовании Html.Action для вызова метода действия [ChildActionOnly]

У меня есть следующий метод действия внутри asp.net mvc5, который я определяю как ChildActionOnly: -

[ChildActionOnly]
public ActionResult GetChildRecords(int customerid)

и, на мой взгляд, я называю это следующим образом:

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

но у меня есть следующие вопросы: -

  1. мне нужно добавить аннотацию [Авторизовать] перед моим дочерним методом действия? или я могу быть уверен, что, поскольку его родитель авторизован, значит, будет авторизован и дочерний метод действия?

  2. могут ли пользователи или хакеры напрямую вызывать ChildActionOnly напрямую?

  3. Могут ли пользователи или хакеры изменить параметры Html.Action?, например, чтобы передать другой пользовательский идентификатор в следующем html: -

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

?


person john Gu    schedule 09.03.2015    source источник


Ответы (2)


Суть атрибута [ChildActionOnly] состоит в том, чтобы гарантировать, что он вызывается только с использованием Action или RenderAction и не может быть вызван непосредственно из браузера.

На вопрос 1: если вызывающее действие уже имеет атрибут [Authorize], вам не о чем беспокоиться.

На вопрос 2: хакеры (или кто-либо еще) не могут получить к нему прямой доступ.

По вопросу 3: поскольку они не могут напрямую вызвать действие, я не уверен, что это о чем беспокоиться. Но всегда проверяйте на стороне сервера любые входные данные, которые вы получаете (формы, строку запроса и т. Д.).

person scartag    schedule 09.03.2015
comment
спасибо за ответ, но я понимаю кое-что, о чем я не позаботился, это то, что мой метод действия вызывается с использованием запросов ajax, и кажется, что украшение моего метода действия с помощью [ChildActionOnly] не позволит ajax вызвать его. так что теперь я запутался, потому что мне нужно, чтобы мой метод действия вызывал либо с использованием запросов ajax, либо с использованием Html.Action, но в то время, когда пользователи или хакеры не вызывали его напрямую? Можете ли вы узнать, есть ли способ справиться с этим? - person john Gu; 10.03.2015
comment
@johnG Вы можете удалить [ChildActionOnly] и украсить действие [Authorize]. И в действии либо проверьте, что этот клиент, вошедший в систему, имеет право проверять идентификатор клиента, который он предоставляет ... либо вы можете использовать для этого фильтр. - person scartag; 10.03.2015

Я согласен с ответом @scartag на вопросы 2 и 3:

2 - это дочернее действие, поэтому его нельзя вызвать напрямую

3 - злоумышленник не может вмешаться, чтобы изменить параметры, передаваемые дочернему действию, поэтому начальной проверки в родительском действии может быть достаточно. Однако это может привести к плохой инкапсуляции, поскольку часть логики дочернего действия может просочиться в родительский.

Что касается вопроса 1, я думаю, что было бы хорошей глубокой защитой разрешить дочернее действие:

  • Сегодня может случиться так, что все родительские действия разрешены, но как насчет будущего? Что, если другой разработчик не осознает, что предполагается, и использует дочернее действие для нового, неавторизованного родительского действия? Возможно, вы могли бы использовать комментарии к коду, чтобы уменьшить вероятность этого, но зачем рисковать?
  • В зависимости от сложности модели разрешений вашего приложения логика авторизации родительского элемента может отличаться от логики авторизации дочернего. Опять же, это может быть не так сегодня, но может быть в будущем.
person Mike Goodwin    schedule 09.03.2015