@Makkons
Фронтенд фрилансер

ModX Formit, почему приходят пустые спам письма?

Есть настроенная отправка форм с сайта modx (formit + ajax).
Приходят пустые спам сообщения клиенту с сайта с незаполненными полями, хотя они установлены как обязательные.
Вручную отправить пустую форму не возможно. К тому же пустые сообщения спама не сохраняются в админке modx, хотя стоит FormItSaveForm.
Если вручную заполнять формы на сайте и отправлять, то все отлично работает, приходят заполненные формы, все сохраняется в админке.
Сообщения спама с пустыми формами приходят с разной периодичностью, могут по несколько штук в день, причем с разных форм.

Стоит защита от спама reCaptchaV3.

Само спам письмо:
63580e0c94563417077676.png

Код чанка этой формы:
[[!AjaxForm?
&snippet=`FormIt`
&form=`form-callback`
&hooks=`rcv3,email,FormItSaveForm`
&emailTpl=`mail`
&submitVar=`sub-callback`
&emailSubject=`Заказ обратного звонка с сайта: [[++site_name]]`
&validate=`name:required,phone:required`
&emailFrom=`[[++email_from]]`
&emailTo=`[[++email_to]]`
 &emailFromName=`[[++site_name]]`
&validationErrorMessage=`В форме содержатся ошибки!`
&successMessage=`Сообщение принято! Наши менеджеры в ближайщее время Перезвонят Вам!`
        ]]


emailTpl:
Имя: [[+name]] <br>
Телефон: [[+phone]] <br>


Сама форма:
<form id="callback_form" class="lb-magic-form" onSubmit="ym(47144835,'reachGoal','header')">
	<p class="lb-p">Ваше Имя:</p>
	<input class="lb-input" type="text" name="name" placeholder="" required="">
	<span class="error_name">[[+fi.error.name]]</span>
	<p class="lb-p">Контактный телефон:</p>
	<input class="lb-input tel" type="text" name="phone" id="phone" placeholder="" required="">
	<span class="error_phone">[[+fi.error.phone]]</span>
	<label style="cursor:pointer;margin:0 auto 10px;display:block;width:245px;font-size:13px;line-height:1.2;"><input type="checkbox" style="display:inline-block;margin:0;box-shadow:none;width:auto;height:auto;" required=""> Согласен на обработку персональных данных</label>
	<input type="submit" name="sub-callback" class="lb-butt" value="Отправить">
	[[!rcv3_html? &action=`[[+rcv3Action:default=``]]` &error=`[[+fi.error.g-recaptcha-response]]`]]
</form>


Еще есть ajax шаблон в ресурсах сайта:
[[!mail?
	&emailTo=`[[++email_to]]`
	&postFields=`name,phone`
	&tplMail=`mail`
	&subject=`Новая заявка с сайта [[++site_name]]`
]]


Сниппет mail:
<?php
$frm_name  = "Stroyresurs";
$sitename  = "Стройресурс";

$fieldsArray = explode(",", $postFields);
foreach($fieldsArray as $field) {
    $field = trim($field);
    $value = trim($_POST[$field]);
    $modx->setPlaceholder($field, $value);
}

$message = $modx->getChunk($tplMail);

mail($emailTo, $subject, $message, "From: stroyresurs <admin@xn--18-mlcpylcbdfbet.xn--p1ai>" . "\r\n" . "Reply-To: $email" . "\r\n" . "X-Mailer: PHP/" . phpversion() . "\r\n" . "Content-type: text/html; charset=\"utf-8\"");


Сниппет rcv3:
<?php
$recaptcha = $hook->getValue('g-recaptcha-response');
$url_google_api = "https://www.google.com/recaptcha/api/siteverify";
$secret = $modx->getOption('formit.recaptcha_private_key');
$ip = $_SERVER['REMOTE_ADDR'];

$modx->lexicon->load('recaptchav3:default');

class Captcha{
    public function getCaptcha($SecretKey, $secret, $url_google_api, $ip){
        $response = file_get_contents($url_google_api . "?secret=" . $secret . "&response=" . $SecretKey . "&remoteip=" . $ip);
        $data = json_decode($response);
        return $data;
    }
}

if ($recaptcha) {
    $ObjCaptcha = new Captcha();
    $data = $ObjCaptcha->getCaptcha($recaptcha, $secret, $url_google_api, $ip); 

    if ($data->success  && $data->score > 0.5) {
        return true;
    } else {   
        $hook->addError('g-recaptcha-response', $modx->lexicon('recaptchav3_check_error'));
        $error_message = "";
        $error_message .= $modx->lexicon('recaptchav3_check_error_log') . "<br/>";
        foreach ($data->{'error-codes'} as $k => $v) {
            $error_message .= "{$k} - {$v}<br/>";
        }
        $modx->log(MODX_LOG_LEVEL_ERROR, $error_message);
        return false;
    }
} else {
    $hook->addError('g-recaptcha-response', $modx->lexicon('recaptchav3_check_empty_error'));
    $modx->log(MODX_LOG_LEVEL_ERROR, $modx->lexicon('recaptchav3_check_empty_error_log'));
    return false;
}

return true;


Куда вообще нужно копать? Не понимаю каким образом в принципе отправляются письма, если их нет в админке. Такое ощущение что сайт как будто заражен и сторонний код просто шлет переодически эти письма, но не знаю на сколько это вероятно вообще.
  • Вопрос задан
  • 209 просмотров
Пригласить эксперта
Ответы на вопрос 1
an-tar
@an-tar Куратор тега MODX
Full stack web developer
1. На скриншоте письмо с темой "запись на экскурсию с сайта.." а formit использует subject=`Заказ обратного звонка с сайта: [[++site_name]]`, это точно ТО письмо?
2. Что за сниппет mail?
3. Что за хук rcv3(точнее так - что внутри, понимаю, что это про рекапчу) в &hooks=`rcv3,email,FormItSaveForm`?
4. И да, даже при установленной рекапче возможен спам, видал и такое)) Не рекапчей единой как говорится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы