Есть несколько способов предотвратить это.
Первый - вообще не отправлять конфиденциальные данные клиенту. Сохраняйте идентификатор сообщения в переменных сеанса, чтобы пользователь никогда не мог его редактировать. Это может или не может быть вариантом в зависимости от вашей архитектуры.
Следующий подход заключается в преобразовании прямой ссылки в косвенную. Например, вместо отправки postids = {23452, 57232, 91031} клиенту для отображения выпадающего списка, вы должны отправить непрозрачный список {1,2,3}. Один сервер знает, что 1 означает 23452, 2 означает 57232 и так далее. Таким образом, пользователь не может изменить любой параметр, который вы не хотите, чтобы он.
Последний подход включает в себя какое-то хэш-значение, которое добавляется в качестве проверки целостности. Например, предположим, у вас есть 3 скрытых поля на html-странице - {userId = 13223, postId = 923, role = author}. Сначала вы сортируете имена полей, а затем объединяете значения, чтобы получить строку типа postId=923&userId=13223&role=author
. Затем добавьте к этой строке секрет сервера и хешируйте (SHA-1 или MD5) всю строку. Например, SHA-1('postId=923&userId=13223&role=author&MySuperSecretKey')
. Наконец добавьте это хешированное значение как скрытый параметр. Вы также можете добавить еще одно скрытое поле с именем ProtectedParameters=userId,postId,role
.
Когда будет сделан следующий запрос, повторите весь процесс. Если хеш отличается, заблокируйте процесс.
Мудро, я перечислил опции в порядке убывания. В то же время, это, вероятно, в порядке возрастания удобства. Вы должны выбрать правильный микс для своего приложения.