Расширенные антиспам меры для PHP контактной формы - PullRequest
0 голосов
/ 06 июля 2019

Получение запутанного спама, который не должен быть возможен из-за требований антиспама и форм, которые у меня есть, поэтому мне нужна помощь в определении того, как атаковать этого конкретного бота.

У меня есть простая форма для связи со мной на моем веб-сайте, которая использует PHP для отправки мне электронного письма. Он запускается через PHP. Примерно 3 раза в день я получаю электронное письмо, в котором форма заполняется буквой «1», например «Имя: 1», «Электронная почта: 1», «Сообщение»: 1. У меня есть формат электронной почты, необходимый для моего поля (требующий @ what.com ), У меня есть капча И у меня установлена ​​приманка, но я получаю эти письма.

Моя форма и код с картинки:

<form method="post" action="contact.php">
<label class="contenttext">Your Name:</label>
<input name="senderName" class="inputemail" required="required"><br/><br/>
    <label class="contenttext">Your Email Address:</label>
<input name="senderEmail" class="inputemail" type="email" required="required"><br/><br/>
    <!-- HONEYPOT --><input type="text" id="catcher" name="catcher"/>
    <textarea name="message" required="required"></textarea><br/><br/>

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
      <div class="g-recaptcha" data-sitekey="(mysitekey)"></div>
<br/>


<div class="capfail" id="capfail">Please check the Captcha box.</div><br/>


<script>
$("form").submit(function(event) {

   var recaptcha = $("#g-recaptcha-response").val();
   if (recaptcha === "") {
      event.preventDefault();
      $("#capfail").show();
   }
});
</script>

И мой код PHP:

<?php

$webmaster_email = "myemail@gmail.com";

$feedback_page = "contact.html";
$error_page = "404.shtml";
$thankyou_page = "contactsuccess.html";

$senderEmail = $_REQUEST['senderEmail'] ;
$message = $_REQUEST['message'] ;
$senderName = $_REQUEST['senderName'] ;
$msg = 
"First Name: " . $senderName . "\r\n" . 
"Email: " . $senderEmail . "\r\n" . 
"\r\n" . "Message: " . "\r\n" . $message ;

function isInjected($str) {
    $injections = array('(\n+)',
    '(\r+)',
    '(\t+)',
    '(%0A+)',
    '(%0D+)',
    '(%08+)',
    '(%09+)'
    );
    $inject = join('|', $injections);
    $inject = "/$inject/i";
    if(preg_match($inject,$str)) {
        return true;
    }
    else {
        return false;
    }
}

if (!isset($_REQUEST['senderEmail'])) {
header( "Location: $feedback_page" );
}

elseif (empty($senderName) || empty($senderEmail)) {
header( "Location: $error_page" );
}

elseif ( isInjected($senderEmail) || isInjected($senderName)  || isInjected($message) ) {
header( "Location: $error_page" );
}

elseif(!empty($_POST['catcher'])) {
header( "Location: $error_page" );
}


else {

    mail( "$webmaster_email", "Feedback Form Results", $msg );

    header( "Location: $thankyou_page" );
}

?>

Это должно эффективно блокировать автоматическое заполнение ботов приманкой, проверять, является ли кто-то человеком с капчей, и требовать, чтобы поля соответствовали определенному формату. Есть ли что-то еще, что я пропускаю, или кто-нибудь может помочь мне понять, как я все еще буду получать подобные письма?

UPDATE: Было отмечено, что я не использую проверку на стороне сервера. Я могу настроить серверную часть, но это нарушает мой код div / show в моей HTML-форме. Есть ли способ отправить форму, прямо в файл PHP, проверить PHP, проверена ли капча, и если нет, вернуть пользователя в файл HTML (в идеале, если форма еще заполнена, чтобы ничего не потеряно), и отобразите маленькую надпись «Пожалуйста, отметьте поле с картинкой». сообщение, как я сейчас настроил?

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Хорошо, давайте создадим файл проверки

validation.php

<?php
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR-SECRET-KEY&response=".$captcha_data."&remoteip=".$_SERVER['REMOTE_ADDR']);


if ($response.success) {

    //run your php code here 
    
    
} else {
   
  // go back to your main page or run any other code here
  
header( "Location: index.php" ); 
}


?>

так в вашем html

<form method="post" action="contact.php">
<label class="contenttext">Your Name:</label>
<input name="senderName" class="inputemail" required="required"><br/><br/>
    <label class="contenttext">Your Email Address:</label>
<input name="senderEmail" class="inputemail" type="email" required="required"><br/><br/>
    <!-- HONEYPOT --><input type="text" id="catcher" name="catcher"/>
    <textarea name="message" required="required"></textarea><br/><br/>

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
      <div class="g-recaptcha" data-sitekey="(mysitekey)"></div>
<br/>

<?php
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR-SECRET-KEY&response=".$captcha_data."&remoteip=".$_SERVER['REMOTE_ADDR']);


if ($response.success) {

    echo '<script>
$("form").submit(function(event) {

   var recaptcha = $("#g-recaptcha-response").val();
   if (recaptcha === "") {
      event.preventDefault();
      $("#capfail").show();
   }
});
</script>';
    
    
} else {
   
  echo '<div class="capfail" id="capfail">Please check the Captcha box.</div><br/>';
}


?>
0 голосов
/ 06 июля 2019

Вы применяете CAPTCHA на клиенте, а не на сервере. Все, что нужно, чтобы победить это для клиента, чтобы отключить JavaScript. Вам абсолютно необходимо выполнить все проверки безопасности на сервере.

...