Добавьте токен, который вы генерируете динамически, и сохраните его в сеансе пользователя. Когда пользователь отправляет форму, убедитесь, что токен из формы совпадает с токеном в сеансе. Этот токен должен меняться каждый раз при визуализации формы. Это позволит отправлять форму только один раз.
Если пользователь отправляет форму с устаревшим токеном, просто попросите его повторно опубликовать форму с сообщениями об ошибках, говорящими о том, что форма устарела, и ему необходимо повторить операцию.
Curl может эмулировать браузер, поэтому ничто не будет эффективным на 100%, но это покрывает большинство случаев.
Вы также можете заполнить это поле токена JavaScript, так как curl его не выполняет.