2015-08-06 4 views
1

Я работаю над приложением 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».

+0

Не передавать секреты пользователям? Почему бы не передать пользователю уникальный идентификатор для своего сеанса в URL-адресе или в качестве файла cookie и сохранить все данные на сервере? Таким образом у них нет ничего, что они могут отредактировать/испортить/взломать. – whoisj

ответ

2

Я бы приблизился к этому с точки зрения безопасности «&». Пользователи должны иметь возможность изменять то, что они должны изменить, данные должны также быть проверены на стороне сервера, а затем вы можете игнорировать все подделки :-)

+0

Согласен. Я решил проверить свой объект сеанса на загрузке страницы, чтобы AppId еще не был в сеансе. Если в сеансе есть AppId, я перенаправляю пользователя для обработки этого приложения с соответствующим предупреждающим сообщением. В принципе, только одно приложение может обрабатываться одновременно, чтобы предотвратить подделку элементов формы. – EasyComputer

+0

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

+0

Но пользователь не сможет редактировать идентификатор приложения через пользовательский интерфейс. Мне просто нужно, чтобы он сохранялся в форме, поэтому я знаю, какое приложение нужно редактировать при обратной передаче. Использование сеанса, похоже, облегчает это. – EasyComputer

1

Лучший подход, который я нашел, - это проверить Объект сеанса AppId при загрузке страницы. Если он существует, то пользователь не завершил обработку исходного приложения (этот сценарий можно обрабатывать различными способами. Я позволю вам решить, что лучше, но вы, вероятно, могли бы перенаправить пользователя обратно для обработки исходного приложения с соответствующим предупреждающее сообщение, объясняющее, что произошло). Это единственный способ, которым я могу думать, чтобы предотвратить подделку AppId в форме с использованием одного объекта сеанса.

+0

После дальнейшего рассмотрения, я думаю, у @Miloslav Raus был хороший момент. Моя проблема заключается в том, что пользователь admin подделывает данные злонамеренно, но администратор имеет возможность напрямую редактировать любые записи, которые потенциально могут быть подделаны. Кому-то просто нужно будет испортить данные только ради того, чтобы запутать вещи, чтобы это стало проблемой в моем проекте. – EasyComputer

+0

Я согласен, что его подход, вероятно, более уместен. Я просто пытался ответить на вопрос «как запретить пользователям форматировать данные формы» с помощью простого решения: хранить идентификатор для данных, на которые вы ссылаетесь в сеансе, и разрешать пользователям редактировать только одну форму за раз. –

+0

Сессия, БД, хранилище ключей (т.е. серверная сторона). Или подписывать/шифровать данные, которые вы хотите защитить на стороне клиента. Но нет защиты от изменений, которые пользователю разрешено делать в обычном режиме. –

Смежные вопросы