У меня имеется сайт с формой для связи, где пользователь вводит своё имя, E-Mail и пишет своё сообщение. Далее он должен заполнить капчу (ReCaptcha v2) и отправить запрос.
После заполнения данные из формы подставляются в библиотеку PHPMailer и она отправляет мне это сообщение на E-Mail.
Функция работает, но после популяризации сайта, через форму начал приходить спам (причём через заданный промежуток времени). Как правильно защитить форму от спама и на каком именно уровне? Есть мысли, что необходимо создать проверку отправленных данных через DNS (для того, чтобы перед отправкой формы быть уверенным, что они были отправлены именно из моей формы), или проблема с капчей (что робот может обойти её), или проблема вовсе в уязвимости библиотеки PHPMailer. Пробовал разные версии ReCaptcha (v2 и v3). В статистике Google показывает рейтинг пользователей только 0.7 и 0.9 (то есть довольно высокий.). Я на 100% уверен, в статистике отображаются спамеры, так как несколько дней мониторил статистику Google и отправленные мне сообщения.
HTML-форма отправки:
<form action="newform.php" id="feedBackForm" method="POST">
<label>
<input class="form" type="text" pattern="^[a-zA-Z-А-Яа-яЁё\s]+$" name="name" id="name" placeholder="Ваше имя" maxlength="20" required oninvalid="this.setCustomValidity('Введите Ваше имя')" oninput="setCustomValidity('')" />
</label>
<label>
<input class="form" type="email" name="email" placeholder="E-Mail" maxlength="50" required oninvalid="this.setCustomValidity('Введите Ваш E-Mail')" oninput="setCustomValidity('')" />
</label>
<label>
<textarea class="form" name="message" placeholder="Сообщение" cols="30" rows="10" style="height:25vh" maxlength="300" required oninvalid="this.setCustomValidity('Напишите сообщение')" oninput="setCustomValidity('')"></textarea>
</label>
<label>
<input id="check" name="check" type="hidden" value="" />
</label>
<div class="g-recaptcha" data-sitekey="KeyReCaptcha"></div>
<div class="text-danger" id="recaptchaError"></div>
<button onclick="document.getElementById('check').value = 'bread';">Отправить</button>
</form>
JavaScript-код ReCaptcha:
<script>
$(document).ready(function () {
$("#feedBackForm").on("submit", function (event) {
event.preventDefault()
let captcha = grecaptcha.getResponse();
if (!captcha.length) {
$('#recaptchaError').text('* Вы не заполнили капчу!');
} else {
$('#recaptchaError').text('');
let dataForm = $(this).serialize()
$.ajax({
url: 'newform.php',
method: 'post',
dataType: 'html',
data: dataForm,
success: function (data) {
grecaptcha.reset();
}
});
}
})
})
</script>
Причём есть небольшая проверка на стороне сервера:
if ($_POST['check'] != 'bread')
exit('Spam detected!');
else {
//Отправка сообщения, если не спам
}
В интернете я не нашёл решения этой проблемы, хотя люди с ней сталкиваются.