Обычно, если форма отправляется по нажатию кнопки, эта кнопку нужно сразу после нажатия перевести в состояние disabled (в обработчике onClick). Тогда нажать кнопку несколько раз подряд просто не получится.
Но, на сколько я понял, вы боитесь, что пользователь отредактирует JS в браузере и отправит данные заново с помощью измененного JS. Если это так, то нужно сказать, что любой POST-запрос можно таким образом продублировать - для этого даже не обязательно редактировать JS, можно использовать утилиты типа curl или wget, либо некоторые расширения браузера. Я бы рекомендовал не беспокоиться по этому поводу.
Но если вы все же хотите застраховаться от этого - генерируйте на сервере особый одноразовый ключ при генерации страницы с формой и включайте его в форму в виде hidden поля. (При использовании фреймворка PHP Laravel для этого можно воспользоваться функцией str_random()) Сохраняйте этот ключ в данных сессии и затем, при получении данных формы, проверяйте: если пришедший с данными формы ключ существует в данных сессии, то продолжить обработку и затем удалить ключ; если же пришедший с формой ключ в данных сессии отсутствует, то возвращайте ошибку 403 Bad request.