Запретить изменение скрытого поля - PullRequest
9 голосов
/ 15 мая 2010

Что делать, если у меня есть форма ChangePassword со скрытым полем ID пользователя.

BadPerson знает идентификатор GoodPerson. Он открывает форму «Изменить пароль» с помощью FireBug, изменяет свой идентификатор на идентификатор GoodPerson, поэтому пароль меняется для GoodPerson.

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

Спасибо заранее.

EDIT Хорошо, смена пароля - плохой пример. Любая форма редактирования, где у меня есть идентификатор в скрытом поле, имеет ту же проблему.

Ответы [ 2 ]

20 голосов
/ 15 мая 2010

Я согласен с Дарином, что проверка подлинности с помощью форм позаботится о конкретной проблеме, упомянутой выше (смена пароля). Этот ответ предназначен для более общего вопроса о том, чтобы убедиться, что значение скрытого поля не изменилось.

Лучшее решение для этого - включить другое скрытое поле, которое содержит хэш значения первого скрытого поля. Таким образом, если 1-е скрытое поле будет изменено, вы узнаете об этом. Сгенерированный HTML выглядит примерно так:

<input id="productId" name="productId" type="hidden" value="1" />
<input id="productId_sha1" name="productId_sha1" type="hidden" value="vMrgoclb/K+6EQ+6FK9K69V2vkQ=" />

Эта статья показывает, как это сделать, и включает исходный код для расширения Html.SecuredHiddenField, которое позаботится о логике для вас.

7 голосов
/ 15 мая 2010

Ничто не сообщит вам, что значение скрытого поля было изменено или нет. Для пользователя, чтобы изменить свой пароль, это означает, что он должен быть аутентифицирован. При использовании проверки подлинности по формам идентификатор текущего пользователя, прошедшего проверку, сохраняется в зашифрованном файле cookie, который нельзя изменить.

Это означает, что вы не должны использовать скрытые поля для хранения текущего подключенного пользователя. Просто используйте встроенный механизм FormsAuthentication в ASP.NET и никогда не храните такую ​​информацию в скрытых полях. ASP.NET знает, что значение файла cookie не было изменено, заключается в том, что он подписывает его с помощью machineKey , указанного в конфигурации.

Есть важное правило, которому вы должны следовать при работе с безопасностью и аутентификацией: всегда используйте встроенные механизмы безопасности, никогда не используйте свои собственные.

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