Простое решение - используйте ключи формы. Каждый раз, когда вы визуализируете форму, создайте случайную уникальную строку и добавьте ее в форму как скрытое поле. В дополнение к этому, храните этот ключ внутри таблицы с отметкой времени. Вы также можете связать эту запись с текущим пользователем, если хотите.
После того, как пользователь опубликует форму, вам просто нужно проверить, существует ли ключ внутри таблицы, и удалить ее. Если ключ не существует - показать какое-то сообщение об ошибке.
Преимуществом этого подхода также является то, что вы предотвращаете атаки csrf.
Если вы не хотите использовать таблицу, вы также можете сохранить форму-ключ внутри сеанса пользователя, но это приведет к дополнительной работе, если вы захотите поддерживать несколько открытых окон браузера с формами одновременно.
Существует также встроенный csrf, использующий куки. Вам просто нужно включить его ($config['csrf_protection'] = TRUE;
) и использовать form_open
для создания формы