Я работаю над приложением C# MVC, где пользователи отправляют приложения административным пользователям для просмотра. Приложения могут быть одобрены или отклонены административными пользователями. Моя домашняя страница для администраторов отображает список поданных приложений, и нажатие на каждое приложение открывает новую страницу, на которой обрабатываются приложения.Как запретить пользователям форматировать данные формы
Моя забота проста: поскольку атрибут «Id» для каждого приложения является скрытым элементом html в форме «Process Application» администратора, возможно, пользователь может изменить идентификатор приложения и отправить форму (в свою очередь утверждение/отказ в неприемлемой заявке). Я могу обойти это, используя объект Session для «AppId», и проверка AppId, опубликованная в форме, совпадает с сеансом AppId.
Однако (и это настоящая проблема), если я установил Session ["AppId"] = applicationId, этот объект сеанса можно легко переопределить, если пользователь должен был попросить обработать другое приложение перед отправкой первого. Возможно, пользователь-администратор воображает себя многозадачным и открывает два окна «Process Application». По сути, первая сессия [«AppId»] будет переопределена второй. Это вызывает проблему для обратной передачи, потому что теперь я не могу проверить что-либо на основе сеанса.
При написании этого, я понимаю, что я мог бы добавить элементы управления, чтобы пользователь не мог обрабатывать более одного приложения одновременно. Есть ли альтернативный подход? Также стоит отметить, что только пользователи-администраторы имели бы возможность подделывать идентификатор приложения, что маловероятно, потому что веб-приложение предназначено для помощи пользователям admin. На самом деле я просто ищу наилучшую практику для этих сценариев, а не опасаясь, что кто-то действительно подделает элементы в моей форме.
Является ли мой лучший подход на самом деле хранением AppId в сеансе и предотвращение админов от обработки более чем одного приложения за раз (так что объект сеанса не переопределяется)? Казалось бы, так, но я бы хотел получить совет от сообщества.
PS: Я понимаю, что эта проблема аналогична Secure way to stop users from forging forms. Тем не менее, я думаю, что самая большая разница заключается в том, что я в настоящее время разрешаю пользователям обрабатывать более одного приложения за раз, что мешает мне использовать один объект сеанса для «AppId».
Не передавать секреты пользователям? Почему бы не передать пользователю уникальный идентификатор для своего сеанса в URL-адресе или в качестве файла cookie и сохранить все данные на сервере? Таким образом у них нет ничего, что они могут отредактировать/испортить/взломать. – whoisj