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

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

/Customers/Edit/5

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

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

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

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

Ответы [ 7 ]

13 голосов
/ 08 марта 2010

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

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

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

10 голосов
/ 13 апреля 2009

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

6 голосов
/ 13 апреля 2009

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

3 голосов
/ 24 сентября 2010

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

3 голосов
/ 06 марта 2010

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

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

1 голос
/ 13 апреля 2009

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

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

У меня было такое же беспокойство, и я решил использовать шифрование. Вы можете зашифровать значение CustomerId на стороне сервера и отправить его в виде строки запроса или скрытого поля, чтобы пользователь не мог изменить его, и вы можете расшифровать его, когда захотите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...