Вот такое письмо счастья от хостера получил клиент
TIMEWEB> Спам.
Уважаемый клиент!
От имени вашего пользователя cpxxxx была зафиксирована рассылка писем на несуществующие почтовые ящики, что классифицируется как спам-рассылка. Согласно правилам предоставления услуг, любой вид спама запрещен, поэтому мы были вынуждены заблокировать возможность отправки писем с сервера….
Смотрим логи. А в логах вот такая строчка:
Jan 29 22:07:48 bitrixххх splogger[12019]: 1iwsgm-00037r-6E X-PHP-Originating-Script: «1080:tools.php»
1080:tools.php это Битрикс, знаю уже по опыту. И практически всегда это форма контактов, изредка авторизации.
Я уже писал ранее как добавить Рекаптчу от Гугла на Битрикс. Сам им пользовался несколько раз и решил что оно неудачное, неудобно править несколько файлов в разных местах. Выкладываю решение попроще и более универсальное. Описываю для Битрикса, но оно c минимальными правками годится и для большинства других CMS.
1. для начала на сайте https://www.google.com/recaptcha/admin зарегить сайт который будем защать от спама. Выбрать последнюю recaptcha v3 и получить 2 ключа
2. подключаем в начале страницы которую нам надо защитить от спама файл recaptcha.php . В него вписать ваши ключи. Вот его код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php //recaptcha.php /* * author: fstrange.ru */ define('RECAP_CLIENT', '6Le3EdQUAAAAAMLN...ваш код для клиента'); define('RECAP_SERVER', '6Le3EdQUAAAAAFng7...ваш код для сервера'); function checkRecap() { $recaptcha_key = RECAP_SERVER; $recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify'; $recaptcha_params = array( 'secret' => $recaptcha_key, 'response' => $_POST['recap_response'], 'remoteip' => $_SERVER['REMOTE_ADDR'], ); $ch = curl_init($recaptcha_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $recaptcha_params); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); if (!empty($response)) { $decoded_response = json_decode($response); } $recaptcha_success = false; //dbg2f($decoded_response, 'responce'); if ($decoded_response && $decoded_response->score > 0) { $recaptcha_success = $decoded_response->score; // обрабатываем данные формы, которая защищена капчей } else { // прописываем действие, если пользователь оказался ботом } if($recaptcha_success > 0.5) return $recaptcha_success; return 0; } |
В моем случае я его подключал в файл kontakty/index.php в самое начало require «recaptcha.php»;
3. Далее сразу после формы вставляем javascript . В нем через php <?php echo RECAP_CLIENT ?> вставляется код ключа полученный от гугла, но можно вписать и напрямую. Элемент формы в который Google Recaptcha записывает токен для защиты от спама, добавляется «на лету»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallbackRecap&render=<?php echo RECAP_CLIENT ?>"></script> <script> var onloadCallbackRecap = function () { grecaptcha.ready(function () { grecaptcha.execute('<?php echo RECAP_CLIENT ?>', {action: 'contact_callback'}).then(function (token) { let recapResponse = document.createElement("input"); recapResponse.type = "hidden"; recapResponse.className = "recap_response"; recapResponse.name = "recap_response"; recapResponse.id = "recap_response"; recapResponse.value = token; //!!! выбираем нужную форму селектором let form = document.querySelector('form[name=SIMPLE_FORM_1]'); form.appendChild(recapResponse); }); }); }; </script> |
Вот так выглядит через инспектор добавленный input для рекаптчи если вы все сделали правильно.
4. Теперь нам надо написать сам обработчик для защиты от спама. Мой вариант с точки зрения программирования для Битрикса тот еще костыль. Но экономит время и главное что весь код в одном месте, проще отладка, если она нужна и не надо искать. Это решение не годится если форма обрабатывается «аяксом», тогда придется искать где сам обработчик и добавлять обработку в него.
Итак сразу после require «recaptcha.php»; добавляем обработчик.
1 2 3 4 5 6 7 8 |
if(isset($_POST['WEB_FORM_ID'])){ $recap = checkRecap(); if(!$recap){ // это спам, обрабатываем как вам удобно header('Location: error.php'); //мне удобно средиректить на отдельную страницу ошибки. die(); } } |
5. И завершающий пункт, добавил в ту же папку error.php . В нем у меня просто сообщение об ошибке.
1 2 3 4 5 6 7 |
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Ошибка!"); ?><div class="main_row"> <h1>Не удалось отправить, возможно вы робот?</h1> <br><br> </div><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); |
Вот собственно и все.
Вот так выглядит статистика на форме прикрытой от спама рекапчей на одном из рабочих bitrix сайтов у клиента.
Если у вас что либо не получилось, могу помочь, разумеется за вознаграждение.
Контакты
Свежие комментарии