繁体   English   中英

过滤PHP联系表单上的垃圾邮件

[英]Filtering spam on a PHP contact form

家伙。 我一直在努力解决这个问题,但我对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

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;
?>

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

接下来,您可以使用honeypot字段。 这些是隐藏在人群中但通常由垃圾邮件机器人检测到的字段。 您检查提交是否包含任何内容,如果他们知道它是垃圾邮件。

您还可以检查表单页面显示和提交表单之间的时间。 非常快速的提交表明已经发现了垃圾邮件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM