Вы смотрите на проблему с неправильной точки зрения. Проблема не в том, что пользователь может отправлять неверные значения. Проблема в том, что ваш код на стороне сервера предполагает , что значения верны.
скрытые поля можно редактировать в Inspect Source в веб-браузерах для каждого тела
Да, это правда. Пользователи также могут создавать любые запросы на ваш сервер полностью вне веб-браузера. Принципиально верно, что любой клиент может отправить любой запрос на ваш сервер в любое время.
Вместо того, чтобы пытаться бороться с этим, просто объясните это. Задай себе вопрос ...
Почему нельзя разрешить пользователю X указывать значение Y в этом поле?
Например, возможно, что значение / запись принадлежит другому пользователю, и этот пользователь не должен иметь возможность редактировать записи других пользователей. Тогда это именно то, что вы должны проверять на стороне сервера.
Выражается как псевдокод:
if (!CurrentUser->canEdit($_POST[id_Hidden])) {
die "You are not allowed to edit this record.";
}
// continue editing the record here
Итак, что же такое CurrentUser
? Это зависит от того, как вы отслеживаете, кто является текущим пользователем. (Не входит в вопрос.) Однако, если вы отслеживаете зарегистрированных пользователей, обратитесь к этой информации. А что такое canEdit()
? Это зависит от того, как вы определяете, разрешено ли любому пользователю редактировать данную запись. Вам придется написать эту логику.
Обратите внимание, что приведенный выше код псевдокод , и вы не сможете просто скопировать / вставить его как есть и ожидать, что он будет работать. Но, надеюсь, это иллюстрирует общий смысл. Проще говоря:
Когда пользователь пытается выполнить действие, сначала определите, разрешено ли пользователю выполнять это действие. Если это не так, верните ошибку. Если они есть, выполните действие.
Это действительно все, что нужно сделать. Никогда не доверяйте информации от клиента. Всегда проверяйте, что пользователь имеет право делать то, что он пытается сделать.
<ч />
Примечание, следуя всем другим советам, опубликованным в этом вопросе / ответах до сих пор ...
Сессии не нужны для этого. И полагаться на них для этого будет крайне ограниченным и чрезмерно сложным по мере роста потребностей вашего приложения и роста сложности приложения.
Нет ничего плохого в том, что клиент предоставляет "скрытые" значения, которые использует сервер. Действительно, это позволяет вашим сервисам быть намного более RESTful и намного проще в использовании и обслуживании. Все, что вам нужно сделать, это проверить эти значения на стороне сервера перед их использованием.