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

Какие методы доступны для остановки множественных обратных передач формы в ASP.NET MVC?

Общей проблемой в Интернете является то, что пользователь нажимает кнопку отправки формы несколько раз, поэтому сервер обрабатывает форму более одного раза. Это также может произойти, когда пользователь нажимает кнопку "Назад", отправив форму, и поэтому она снова обрабатывается.

Каков наилучший способ остановить это из ASP.NET MVC?

Возможности, которые я вижу, следующие:

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

Есть ли еще?

Существуют ли какие-либо конкретные реализации любого из них?

Я вижу, что третий вариант реализуется как ActionFilter с расширением HtmlHelper аналогичным образом с анти-подделкой.

Ожидаем услышать от вас MVC'ers.

4b9b3361

Ответ 1

Часто люди пропускают самый обычный способ справиться с этим, чтобы использовать ключи nonce.

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

Мне нравится решение Javascript, потому что оно работает большую часть времени.

ключи Nonce, однако, работают все время. Ключ nonce - это случайный уникальный GUID, сгенерированный сервером (также сохраненный в базе данных) и встроенный в форму. Когда пользователь отправляет форму, ключ nonce также публикуется. Как только POST приходит на сервер, сервер проверяет ключ nonce в своей базе данных. Если это так, сервер удаляет ключ из базы данных и обрабатывает форму. Следовательно, если пользователь POST дважды, второй POST не будет обработан, потому что ключ nonce был удален после обработки первого POST.

Ключ nonce имеет дополнительное преимущество в том, что он обеспечивает дополнительную безопасность, предотвращая повторные атаки (человек посередине нюхает ваш HTTP-запрос и затем повторяет его на сервер, который рассматривает его как законный).

Ответ 2

Вы всегда должны возвращать перенаправление в качестве ответа HTTP на POST. Это предотвратит повторение POST, когда пользователь будет перемещаться вперед и назад с помощью кнопок "Вперед" / "Назад" в браузере.

Если вы беспокоитесь о том, что пользователи дважды щелкают по кнопкам отправки, просто небольшая script отключает их немедленно при отправке.

Ответ 3

Возможно, вам захочется взглянуть на шаблон Post-Redirect-Get (PRG):

Ответ 4

Это действительно не MVC, но шаблон, который мы следуем на наших веб-страницах, заключается в том, что действия выполняются с вызовами AJAX, а не с полными страницами POST. Таким образом, переход к URL-адресу никогда не выполняет действие, просто отображает форму. Вызов AJAX не будет в истории

Ответ 5

Наряду с отключением кнопок вы можете добавить прозрачный div на всю веб-страницу, чтобы щелчок ничего не делал. Мы делаем это на моей работе и добавляем немного дружественного ярлыка, говорящего о запросе на обработку.