Установите лимит не более 1 Сообщения в минуту для одного IP. Причём лимиты увеличатся - больше сообщений - больше лимит, увеличение кратно - 1/2/5 и тд.
Наиболее оптимальный вариант - использование капчи.
Начните с гугла, за счет того что анализируется много поведенческих факторов - обходить ее будет не так легко, но тем не менее реально.
Второй этап - ввод капчи которую тяжело будет обойти.
Если знать внутреннюю кухню сервисов по обходу капч - то можно придти к выводу, что надо придумать свою капчу которая не распространена и будет только у вас.
Первое что приходит на ум -
1. задание для юзера отдается не текстом, а картинкой(но для начала можно и текстом).
2. Если это текст или картинка - тяжело ее достать из html. Например, если это картинка - я не могу получить просто так ссылку на изображение что бы передать в сервис распознавания капч.
-
Если это текст - сделайте некоторые блоки скрытыми при выводе, а юзеру отображайте только нужные. Причём каждый раз скрываем рандомные блоки.
Да это можно обойти путём проверки на display: none каждого из элементов в родительском блоке. Но это еще нужно обойти.
—-
3. Сделать некое действие на сайте, которое нужно будет сделать юзеру. Естественно добавить вариативности. Например: передвинуть какие-то блоки, что бы числа были друг за другом, т е расположены в порядке возрастания. Текст отдаем не голый, а засовываем рядом с ним пробелы/буквы. Да достать число будет более чем реально, но это дополнительные усилия для злоумышленника. А вот если брать некое число из блока, тогда это уже куда сложнее. Например: имеется 3 блока на сайте. Задача: введите последовательно ПЕРВЫЕ числа из первого, третьего и пятого блока. Числа вводите последовательно/через пробелы/через запятые. В Части текста, некоторые буквы замените на английские, но чтобы это смотрелось читаемо и не вырвиглазно - это усложнит парсинг в разы. Капче присылаем некий токен, а ответ в базу - при отправке Формы токен сравним и проверим ответ.
Куда копать, думаю вы поняли. Только не переусердствуйте - пользователи не боты, не нужно их раздражать лишний раз.
Еще как вариант - уйти от SMS, и для начала пользователя проверять по почте. Если это уместно/реально. А sms использовать как дополнительную функцию для проверки пользователя