Основные проблемы с подделкой форм - это то, что вы не можете контролировать то, что отправляет клиент.Пользователь может изменить любой параметр формы.Таким образом, все, что клиент отправляет при отправке формы, должно быть проверено и проверено.
Это также означает, что чем меньше параметров вы предоставляете для отправки в форме, тем меньше вам нужно проверять и подтверждать.В частности, параметры, которые заданы и не подлежат изменению пользователем (то есть скрытые поля формы), не нужно вставлять в форму, если в этом нет особой необходимости.Вместо этого вы можете хранить их в контейнере в сеансе и ссылаться на этот контейнер только через скрытое поле.Если это не вариант, убедитесь, что вы, по крайней мере, можете обнаружить любой недостаток целостности, запевая предустановленные значения с помощью MAC .
Другая проблема заключается в том, что параметры формы, которые должны бытьотправка для успешной отправки формы вполне предсказуема, так что злоумышленник может отправлять неоднократно действительные представления формы.Если вам потребуется непредсказуемый параметр, который может быть выдан только вашим сервером и который проверяется при отправке формы, вы можете убедиться, что отправка формы предоставлена.
Одним из решений будет использование случайногомаркер времени, который генерируется по запросу формы и сохраняется в сеансе, а также помещается в форму как скрытое поле ввода.Затем при отправке формы вы проверяете, предоставлен ли токен и равен ли он указанному в сеансе;если они равны, вы удаляете токен из сеанса и обрабатываете форму, в противном случае вы отказываете в обработке формы.
Честно говоря, этот механизм не совершенен, так как вы все равно можете сначала запросить форму, а затем отправитьПоддельные данные формы.Вот где вы могли бы использовать дополнительные капчи или другие механизмы, которые предотвращают автоматические запросы.
Лучше всего было бы использовать комбинацию всех упомянутых выше мер:
- создать контейнер формы всеанс с достаточно случайным идентификатором;поместите этот идентификатор как скрытое поле ввода в форму, чтобы идентифицировать контейнер формы при отправке формы
- сохранить любые предустановленные параметры в контейнере формы вместо формы
- , если предустановленные параметры не могут быть исключены изформа, аутентифицируйте ее значение с помощью MAC (используйте ключ контейнера для формы)
- , если есть подозрительно повторяющиеся запросы формы / отправки формы, подумайте о дополнительном использовании Captchas для предотвращения автоматических запросов
Кроме того, эти контейнеры форм на основе сеанса также предотвращают CSRF , поскольку их идентификаторы непредсказуемы для атакующей третьей стороны.