首页 > 解决方案 > PHP 联系表单的高级反垃圾邮件措施

问题描述

接收到令人困惑的垃圾邮件,这在我制定的反垃圾邮件和表单要求下是不可能的,因此我需要帮助确定如何攻击这个特定的机器人。

我的网站上有一个简单的联系我表格,它使用 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 表单中的显示/隐藏 div 代码。有没有办法提交表单,直接到 PHP 文件,让我的 PHP 检查验证码是否被检查,如果没有,将用户带回 HTML 文件(理想情况下,他们的表单仍然填写,所以什么都不会丢失)和显示小“请检查验证码”框。消息就像我现在设置的一样?

标签: contact-formspam-prevention

解决方案


您在客户端而不是服务器上强制执行 CAPTCHA。打败它所需要的只是让客户端禁用 JavaScript。您绝对需要在服务器上进行所有安全检查。


推荐阅读