【问题标题】:Filtering spam on a PHP contact form过滤 PHP 联系表单上的垃圾邮件
【发布时间】:2016-08-09 20:24:12
【问题描述】:

伙计们。我一直在努力解决这个问题,但我对 PHP 很陌生。我已经尝试了各种 PHP 垃圾邮件过滤器教程,但是当我将它们写入表单时,它们都不能正常工作。

我一直在尝试修改的代码是:

<?php
header ("Location: index.html");
if( !empty($_POST['topName']) || !empty($_POST['topEmail']) || !empty($_POST['topPhone']) ) {
    $name = $_POST['topName'];
    $emailAddress = $_POST['topEmail'];
    $phone = $_POST['topPhone'];
    $message = $_POST['topMessage'];

    $email_to = "companyname@gmail.com";
    $email_from = "$name <$emailAddress>";
    $email_subject = "Message from online contact form";
    $email_body = "From: $name\n" .
                   "Email: $emailAddress\n" .
                   "Phone: $phone\n\n" .
                   "$message";
    $email_headers = "From: $email_from \r\n" .
                "Reply-To: $emailAddress \r\n";

    mail($email_to, $email_subject, $email_body, $email_headers);
}
exit;
?>

唯一有效的部分是添加 !empty 东西,但这仍然只会阻止垃圾邮件,使这些字段为空。当我按照教程进行操作时,我似乎无能为力。有没有什么我可以做一个超级简单的垃圾邮件过滤器,或者一个新手可以理解的教程?

任何帮助或建议将不胜感激!

【问题讨论】:

  • 在 PHP 中执行表单数据的验证。这有助于防止机器人通过忽略 javascript 绕过验证。添加验证码或其他一些人工验证系统。这可能就像用户在提交表单时必须填写的一个小数学问题一样简单。
  • 可以尝试从这里开始:abeautifulsite.net/a-simple-php-captcha-script
  • 您还可以检查$_SERVER['HTTP_USER_AGENT'] 并确保提交者使用的是真实浏览器。
  • @chris85 我正在尝试阻止几乎为空的电子邮件,这些电子邮件只是色情或垃圾邮件服务的垃圾邮件广告。我已经尝试了一些教程,当你用谷歌搜索“php 垃圾邮件过滤器”并进行类似搜索时弹出的教程。
  • @Twisty - 感谢您的链接,但我正在尝试在没有验证码的情况下执行此操作。不过,我会让用户代理一试!

标签: php email spam-prevention


【解决方案1】:

为确保字段不为空,您可以执行一些验证,如下所示:

<?php

function checkLength($d, $min, $max){
    if(strlen($d) > $max || strlen($d) < $min){
        return false;
    } else {
        return true;
    }
}

function checkRegEx($d, $reg){
    return ereg($reg, $d);
}

$fields = [
    'name' => $_POST['topName'],
    'email' => $_POST['topEmail'],
    'phone' => $_POST['topPhone']
]

$valid = true;

// Check that each is not empty
foreach($fields as $k => $v){
    $valid = $valid && !empty($v);
}

// Add HTML Safe Message
$fields['message'] = htmlentities($_POST['topMessage']);

// Check that name has enough characters
$valid = $valid && checkLength($fields['name'], 3, 25);

// Check that Email has enough characters
$valid = $valid && checkLength($fields['email'], 5, 80);

// Check Email format
$valid = $valid && checkRegEx($fields['email'], "/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/");

if( $valid ) {
    $email_to = "companyname@gmail.com";
    $email_from = "{$fields['name']} <{$fields['email']}>";
    $email_subject = "Message from online contact form";
    $email_body = "";
    $email_body .= "From: {$fields['name']}\r\n";
    $email_body .= "Email: {$fields['email']}\r\n";
    $email_body .= "Phone: {$fields['phone']}\r\n\r\n";
    $email_body .= $fields['message'];
    $email_headers = "From: {$fields['email']}\r\n";
    $email_headers .= "Reply-To: {$fields['email']}\r\n";

    mail($email_to, $email_subject, $email_body, $email_headers);
}
exit;
?>

【讨论】:

    【解决方案2】:

    阻止垃圾邮件的最有效方法之一是确保每个字段都包含预期内容。例如,名称应仅包含字母、电话号码等。如果文本字段不需要包含 URL,则不提交消息将消除大量垃圾邮件。

    接下来您可以使用蜜罐字段。这些是对人们隐藏但经常被垃圾邮件机器人检测到的字段。您检查提交是否包含任何内容,如果他们知道这是垃圾邮件。

    您还可以检查从显示表单页面到提交表单之间的时间。非常快速的提交表明垃圾邮件。

    验证码应该是最后的手段,只有在其他技术提示垃圾邮件时才会显示。

    最后,你可以通过使用一个为你做很多事情的类来让自己的生活变得更轻松,例如http://stefangabos.ro/php-libraries/zebra-form/ 或像 http://wufoo.com 这样的表单构建应用程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多