Подтвердить что ты не робот

Что-нибудь более безопасное, чем скрытые поля формы в ASP.NET MVC?

В ASP.NET MVC (по умолчанию маршрутизация) я хотел бы использовать URL-адрес, подобный этому, для возврата вида с формой для редактирования клиента:

/Customers/Edit/5

Мне нужно использовать CustomerId=5, но я не хочу разрешать клиенту изменять его. Теперь я делаю скрытый идентификатор, используя:

<%= Html.Hidden("CustomerId") %>

Это выполняет то, что я хочу, но у меня создается впечатление, что скрытые переменные формы не защищены и могут управляться конечным пользователем.

Итак, что лучший способ позволить клиенту редактировать свою информацию, но не их идентификатор?

4b9b3361

Ответ 1

Мое решение заключалось в использовании кода Tamper Proofing из книги Стивена Сандерсона ASP.NET MVC. Идея заключается в том, что вы создаете хэш любого скрытого поля формы, которое вы хотите подделать:

<%= Html.Hidden("CustomerId") %>
<%= Html.Hidden("CustomerIdHash") %>

Когда форма отправляется, код Стивена вычисляет другой хэш CustomerId и делает его равным CustomerIdHash. Если это произойдет, то никаких вмешательств не произойдет. Это отличный код и стоит книги.

Ответ 2

Проверяйте разрешения в действии вашего контроллера (/Клиенты/Редактировать) перед отображением соответствующего представления. Обратите внимание, что проблема здесь не в вашем скрытом поле: пользователь может просто набрать " http://yoursite.com/Customers/Edit/10" в своем браузере. Таким образом, вы должны проверить свое действие, действительно ли пользователю разрешено редактировать запрашиваемые детали клиента, независимо от того, как он вызвал действие.

Ответ 3

У вас нет реальной безопасности на стороне браузера. Вы можете поместить идентификатор клиента в строку запроса, но сервер должен проверить, действительно ли разрешено редактировать этого клиента. Если нет, верните ошибку.

Ответ 4

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

Ответ 5

У меня такая же проблема, и я считаю, что решение подразумевает использование суррогатных ключей. В каждой таблице, где у меня есть столбец идентификатора, я также добавляю столбец Key, который является Guid (uniqueidentifier на SQL-сервере). Теперь, когда вы выполняете объединение или какую-либо внутреннюю логику, я использую ID, но контроллер использует ключ. Поскольку это руководство, трудно догадаться, что такое другая запись Guid.

В качестве альтернативы (или в дополнение к вышесказанному) вы можете зашифровать скрытое поле в соответствии с Эта статья

Ответ 6

Есть два аспекта. Я не уверен, о чем вы напрямую спрашивали, но они оба важны:

  • Для любого данного пользователя им не разрешается редактировать всех клиентов. Итак, как предлагает Дмитрий, действие вашего контроллера для сообщения формы должно смотреть на клиента, которого они пытаются отредактировать, и убедиться, что зарегистрированный пользователь действительно разрешил редактировать этого клиента. Вероятно, вы также захотите сделать аналогичную проверку в действии контроллера, которая генерирует форму редактирования в первую очередь и даже не позволяет им получить форму, если им не разрешено редактировать запрашиваемого клиента.
  • Для данного пользователя и данного клиента вы, вероятно, не хотите, чтобы пользователь мог изменить идентификатор клиента. Если вы используете метод UpdateModel в действии контроллера POST, вам нужно использовать параметр белого списка свойств и исключить свойство ID, чтобы пользователь не менял идентификатор. Даже если они изменят значение скрытого поля, измененное значение будет игнорироваться UpdateModel через белый список.