适用于PHP联系人表格的高级反垃圾邮件措施

时间:2019-07-06 05:21:17

标签: contact-form spam-prevention

接收垃圾邮件,这对我已经制定的反垃圾邮件和表单要求是不可能的,因此我需要帮助确定如何攻击此特定的bot。

我的网站上有一个简单的与我联系的表格,该表格使用PHP向我发送电子邮件。它通过PHP运行。每天大约3次,我会收到一封电子邮件,其中的表单填写有“ 1”,例如姓名:1,电子邮件:1,消息:1。我具有我的字段所需的电子邮件格式(要求@ whatever.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" );
}

?>

这应该有效地阻止使用蜜罐自动填充机器人,检查是否有人是验证码人,并要求字段适合特定格式。我还有什么想念的,还是有人可以帮助我了解我仍然会收到这样的电子邮件吗?

更新: 有人指出,我没有使用服务器端验证。我可以设置服务器端,但是这样做会破坏我的HTML表单中的show / hide div代码。有没有一种方法可以将表单直接提交到PHP文件,请让我的PHP检查是否验证了验证码,如果没有,则将用户带回到HTML文件(理想情况下仍填写其表单,因此不会丢失任何内容)并且显示小“请检查验证码”。消息就像我现在设置的一样?

2 个答案:

答案 0 :(得分:0)

您正在客户端而不是服务器上强制执行验证码。击败客户端所需的一切只是让客户端禁用JavaScript。您绝对需要在服务器上进行所有安全检查。

答案 1 :(得分:0)

好吧,我们创建一个验证文件

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/>';
}


?>