Хотя решения JavaScript могут отключить кнопку отправки после ее нажатия, это не повлияет на тех людей, у которых отключен JavaScript. Вы должны всегда заставить вещи работать правильно без JavaScript, прежде чем добавлять его, иначе нет смысла, так как пользователи все равно смогут обойти проверки, просто отключив JavaScript.
Если страница, на которой появляется форма, генерируется динамически, вы можете добавить скрытое поле, содержащее какой-либо порядковый номер, хэш или что-то уникальное. Затем у вас есть проверка на стороне сервера, которая проверит, поступил ли уже запрос с этим уникальным значением. Когда пользователь отправляет форму, уникальное значение проверяется по списку «используемых» значений. Если он существует в списке, это двойной запрос, и его можно отклонить. Если он не существует, добавьте его в список и обработайте как обычно. Если вы уверены, что значение уникально, это гарантирует, что одна и та же форма не может быть отправлена дважды.
Конечно, если страница, на которой находится форма, не генерируется динамически, то вам нужно будет сделать это сложным способом на стороне сервера, чтобы проверить, что та же информация еще не была отправлена.