Как предотвратить изменение идентификатора?

Я разработал доску объявлений с нуля, используя 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.

Другие вопросы по тегам