防止php网络联系表单垃圾邮件 [英] Prevent php web contact form spam
问题描述
我是一名业余网站设计师,我在stackoverflow.com和其他网站上进行了搜索,发现许多针对此问题的修复程序,但均未解决(可能是因为我实施不正确)。我希望有更多知识的人可以为我提供一个简单的修复程序,或者向我展示如何实施我发现的一种修复程序。
I am an amateur web designer, I have searched on stackoverflow.com and other websites and have found many fixes for this issue I'm having, but none of them have worked (probably because I implement them incorrectly). I'm hoping someone with more knowledge can help me with a simple fix or show me how to implement one of the fixes I've found.
问题:我在公司网站上有一个非常简单的php联系人表格。它已经运行了好几年,但是在上个星期被黑了。现在,我每天收到数百份没有任何评论的联系表单,它们仅具有(显然有效的)电子邮件地址,并且在名称字段中包含字符串(例如 58ee8b52eef46)。
The problem: I have a very simple php contact form on my business's website. It has worked great for years, but in the last week has been hacked. I now receive hundreds of contact form submissions a day with no comments, they only have (apparently valid) email addresses, and a string of characters in the name field (like "58ee8b52eef46").
我尝试了几种防止这种垃圾邮件的技术,它们要么破坏了我的php形式,要么没有阻止垃圾邮件。 如果可能的话,我想要一个不需要验证码变形的文本测试并且不需要填写表格所有字段的解决方案。
I have tried several techniques to prevent this spam, and they either break my php form, or they don't prevent the spam. If possible I would like a solution that does NOT require a Captcha distorted text test, and does NOT require all fields of the form to be filled.
这是我完整的PHP代码:
Here is my full PHP code:
<?php
if(isset($_POST['email'])) {
$email_to = "myemail@example.com";
$email_subject = "website form submission";
function died($error) {
echo "We are very sorry, but there were error(s) found with the form you submitted. ";
echo "These errors appear below.<br /><br />";
echo $error."<br /><br />";
echo "Please go back and fix these errors.<br /><br />";
die();
}
if (!isset($_POST['name']) ||
!isset($_POST['email']) ||
!isset($_POST['telephone']) ||
!isset($_POST['comments'])) {
died('We are sorry, but there appears to be a problem with the form you submitted.');
}
$name = $_POST['name'];
$email_from = $_POST['email'];
$telephone = $_POST['telephone'];
$comments = $_POST['comments'];
$error_message = "";
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Form details below.\n\n";
function clean_string($string) {
$bad = array("content-type","bcc:","to:","cc:","href");
return str_replace($bad,"",$string);
}
$email_message .= "Name: ".clean_string($name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Telephone: ".clean_string($telephone)."\n";
$email_message .= "Comments: ".clean_string($comments)."\n";
$headers = 'From: '.$email_from."\r\n" .
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
?>
Thank you for contacting us. We will be in touch with you soon. You will now be redirected back to example.com.
<META http-equiv="refresh" content="2;URL=http://www.example.com">
<?php
}
die();
?>
推荐答案
一个简单的技巧是创建蜜罐字段:
A simple trick is to create a honeypot field:
html
<!-- within your existing form add this field -->
<input type="text" id="website" name="website"/>
css
/*in your css hide the field so real users cant fill it in*/
form #website{ display:none; }
php
//in your php ignore any submissions that inlcude this field
if(!empty($_POST['website'])) die();
这篇关于防止php网络联系表单垃圾邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!