Передавать важные значения на стороне сервера при обработке формы

Я работаю над плагином, который имеет тег <form> :

 <input type="hidden" name="postid" value="<?php echo $postid; ?>"> 

Проблема заключается в том, что пользователи могут легко проверять элемент , изменять значение и, таким образом, влиять на обработку формы.

Обработка формы происходит через функцию ajax и находится вне цикла (очевидно).

Как вы обычно решаете этот тип сценария?

Честно говоря, я думаю, что этот вопрос не соответствует теме, потому что его тема – это общая концепция, которая может применяться к любому языку, способному обрабатывать веб-разработку. Так что даже шире, чем общий вопрос PHP.

Кстати, я хочу предложить слишком много для комментария.

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

Простой пример. Предполагая, что у вас есть такая форма:

 <?php $data = get_my_form_data(); ?> <form method="post"> <input type="hidden" name="postid" value="<?= $data['postid'] ?>"> <input type="text" name="vote" value="<?= $data['vote'] ?>"> <input type="text" name="username" value="<?= $data['username'] ?>"> <form> 

Функция, которая извлекает данные, точно так же, как заполнитель для получения четких данных, поступает с сервера, а затем используется для заполнения значений форм.

Теперь давайте посмотрим, как можно внедрить целостность данных. Обычно это делается с двухсторонним (обратимым) шифрованием.

 <?php function obfuscate_postid($id) { return wp_create_nonce('pre-md5').md5($id.AUTH_SALT).wp_create_nonce('post-md5'); } $data = get_my_form_data(); $check = obfuscate_postid($data['postid']); ?> <form method="post"> <input type="hidden" name="postid" value="<?= $data['postid'] ?>"> <input type="text" name="vote" value="<?= $data['vote'] ?>"> <input type="text" name="username" value="<?= $data['username'] ?>"> <input type="hidden" name="__ch" value="<?= $check ?>"> <form> 

Таким образом, при обработке на стороне сервера вы можете проверить, что

 $valid = obfuscate_postid($_POST['postid']) === $_POST['__ch']; 

Если пользователь меняет идентификатор сообщения в форме без изменения строки проверки, $valid above является ложным, и вы можете прекратить обработку данных.

Я использовал довольно простое двухфазное обфускацию, и благодаря тому, что nonce не фиксируются во времени, это довольно сильный способ защитить ваши данные.

Я также использовал nonces, чтобы сделать ответ немного более связанным с WordPress;)

Было бы очень сильной системой, если бы nonce можно было использовать только один раз, но это система голосового голосования, а не приложение для онлайн-банкинга. И если вы хотите, вы также можете изменить nonce TTL .

Наконец, обратите внимание на то, как я использовал соль, чтобы сделать md5 более безопасным, потому что даже если md5 не является обратимым, результат md5 для одиночных целых чисел можно легко найти (например, попробуйте это, используя строку b706835de79a2b4e80506f582af3676a ).