Как предотвратить изменение идентификатора?
Я разработал доску объявлений с нуля, используя CodeIgniter, PHP и PDO для MySQL. Сейчас я в настоящее время очищаю его и проверяю на наличие дефектов / недостатков безопасности. Я столкнулся с небольшим дефектом, для которого я не могу придумать твердого решения. Пользователи могут заполнять мою базу данных случайными комментариями, которые даже не связаны ни с какими сообщениями на форуме. Чтобы лучше описать эту проблему, позвольте мне кратко объяснить мою систему.
Когда вы входите в систему, чтобы просмотреть сообщение, объект сообщения вместе со связанными комментариями через post_id
вытащены из базы данных. Вы можете прочитать пост и оставить свой комментарий. Форма комментария внизу имеет скрытое поле с именем pid
где хранится идентификатор текущего сообщения, которое мы просматриваем, поэтому я могу сохранить состояние, когда вы нажимаете кнопку отправки. Однако в этом есть недостаток. Скрытое поле может быть изменено на любое целочисленное значение перед отправкой, как вы, вероятно, догадались.
Схема URL выглядит примерно так, когда вы просматриваете сообщение;
http://www.domain.com/forum/post/22
И после нажатия кнопки отправки вы будете перенаправлены на URL-адрес, который выглядит следующим образом;
http://www.domain.com/forum/create_comment
... где информация комментария будет вставлена в базу данных вместе с идентификатором пользователя и идентификатором поста.
Я пытался протестировать URL-адрес реферера, но случай аналогичный. Я придумал несколько решений, но я не знаю, являются ли какие-то из них идеей? Применение JavaScript, сохранение pid
в сеансе и / или сокрытие информации, скрытой в поле.
1 ответ
Вы не можете применять JavaScript, сохраняя pid
в сеансе собирается загнать любого с несколькими орехами вкладок, и запутывание никогда не работает хорошо.
Одним из возможных решений является использование соленого хэша для проверки данных. Например:
<input type="hidden" name="pid" value="<?= $pid ?>" />
<input type="hidden" name="pid_hash" value="<?= sha1('this is my salt' . $pid) ?>" />
При отправке вы отклоняете все, что не соответствует pid
значение. Так как соль никогда не подвергается воздействию браузера пользователя, им должно быть трудно подделать ее для несуществующего pid.