@darkersoul
web - программист

Почему спам-бот обходит серверную валидацию данных формы?

Привет! Через форму обратной связи шлется спам. Причем каким-то образом он обходит проверку данных формы на стороне сервера в php. вручную имитировал такие же запросы - проверку не проходит, все ок. а вот спам-боты как-то проходят.

Вот пример спам письма: заметьте бот умудряется отправлять пустые названия полей!
b6ac09a02d.jpg

Вот пример тестового письма:
572f41dca1.jpg

Обработчик формы:

<?php
require_once(dirname(__FILE__).'/class.phpmailer.php');
$method = $_SERVER['REQUEST_METHOD'];

$message = '';
$email = new PHPMailer();
$c = true;
//$secret = htmlspecialchars(trim($_POST["secret_field"]));
//$honeypot = htmlspecialchars(trim($_POST["firstname"]));

if($_FILES['upfile']['name'] != ""){
	for($i=0; $i < count($_FILES['upfile']['name']); $i++){
		$name_of_uploaded_file = basename($_FILES['upfile']['name'][$i]);
		$file_to_attach = $_FILES["upfile"]["tmp_name"][$i];
		$email->AddAttachment($file_to_attach, $name_of_uploaded_file);
    }
}

$project_name = trim($_POST["project_name"]);

$admin_email  = trim($_POST["admin_email"]);
$form_subject = trim($_POST["form_subject"]);

# spam filter: устанавливаем переменную
$no_spam = true;
#

foreach ( $_POST as $key => $value ) {
	$key = empty($key) ? 'x' : $key;
	# spam filter: проверяем поле ввода на спам по признакам в массиве. обновляем переменную если есть спам.
	if($key == 'Комментарий' or $key == 'x' ){
		$no_spam = ($value == str_replace(array( 'WhatsApp', 'whatsapp', 'http://', 'https://', 'www.', '.ru', '.com', '[url', '<a ', ' seo ' ),'',$value));
	}
	#
	if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" && $key != "consent" ) {
		$message .= "
		" . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . "
		<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
		<td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
		</tr>
		";
	}
}

$message = "<table style='width: 100%;'>$message</table>";

function adopt($text) {
	return '=?UTF-8?B?'.base64_encode($text).'?=';
}

$headers = "MIME-Version: 1.0" . PHP_EOL .
"Content-Type: text/html; charset=utf-8" . PHP_EOL .
'From: '.adopt($project_name).' <info@'.$_SERVER['HTTP_HOST'].'>' . PHP_EOL .
'Reply-To: '.$admin_email.'' . PHP_EOL;


$email->CharSet   = "utf-8";
$email->From      = 'info@domain.ru';
$email->FromName  = $project_name;
$email->Subject   = $form_subject;
$email->isHTML(true);
$email->Body      = $message;
$email->AddAddress( $admin_email );
$email->AddAddress( 'alexdio85@domain.ru' );
# spam filter: отсылаем заявку на почту если спама нет
if($no_spam) $email->Send();
#


Помогите понять как такое возможно. И какие варианты решений есть? На вскидку есть несколько мыслей, но время не хочется терять. wordpress. Обычный хостинг regru. есть такая же проблема и похожий спам-бот на timeweb и Битриксе. Спасибо!
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
А вы тупо не видите свой же исходный код? И не замечате, что спам-бот присылает сообщения с пустыми $key, то есть нигде нет поля "Комментарий", из-за которого нужно бы блокировать? И поля "x" тоже ни одного нет. Есть только "E-mail" и "upfile". Не видите, что POST делается не со страницы с формой, а на прямую?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы