Добрый день!
Самое верное решение будет сначала определить:
На какой именно скрипт нежелательны пост запросы? Например, на скрипт обработки какой-то формы (обратной связи, предположим). Следовательно, есть несколько решений валидации полей этой формы на стороне сервера. Самое грамотное решение (ИМХО), это внедрение reCaptcha v3.0.
Особенностью именно третей версии является то, что пользователю не нужно вводить капчу, а она работает в фоновом режиме, что очень удобно.
Для нужно будет:
1) На фронте вам достаточно подключить скрипт от googl`а для формирования токена:
<script src="[https://www.google.com/recaptcha/api.js?render=ПУБЛИЧНЫЙ_КЛЮЧ](https://www.google.com/recaptcha/api.js?render=ПУБЛИЧНЫЙ_КЛЮЧ)"></script>
Сам публичный ключ (и секретный, который позже понадобится) можно получить здесь 2) Перед отправкой формы добавлять сформированный токен от reCaptcha (пример с синтаксисом на JS):
document.querySelectorAll('form.form').forEach(function(elem) {
elem.addEventListener("submit", function(e) {
let formForm = this;
e.preventDefault();
grecaptcha.ready(function() {
grecaptcha.execute('ПУБЛИЧНЫЙ_КЛЮЧ', {action: 'submit'}).then(function(token) {
var formData = new FormData(formForm);
formData.append("token", token);
var xhr = new XMLHttpRequest();
[xhr.open](http://xhr.open)("POST", "/ПУТЬ_ДО_ФАЙЛА_ОБРАБОТЧИКА.php");
xhr.onload = function(e) {
if (this.status == 200) {
// Выведем в консоль ответ от обработчика
[console.log](//console.log)(this.response);
} else {
// обработать ошибку
alert( this.status + ': ' + this.statusText ); // пример вывода: 404: Not Found
}
};
xhr.send(formData);
});
});
});
});
3) На стороне бека (PHP - как пример):
//reCaptcha 3.0
$resCaptcha = curl_send('[https://www.google.com/recaptcha/api/siteverify](https://www.google.com/recaptcha/api/siteverify)', http_build_query([
'secret' => 'СЕКРЕТНЫЙ_КЛЮЧ',
'response' => $_POST['token'],
'remoteip' => $_SERVER['REMOTE_ADDR']
]));
$reCap = json_decode($resCaptcha,1);
if ($reCap['success']&&($reCap['score']*10)>5)
{
// обработка входных данных
...
echo 'OK';
}
else echo 'ERROR';
function curl_send($url, $queryData = [], $headers = []) {
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_POSTFIELDS => $queryData,
));
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
Таким образом все запросы от формы вы защитите от спама и нежелательных POST запросов.