PHP电子邮件表单拍摄空白电子邮件

PHP电子邮件表单拍摄空白电子邮件,php,forms,email,Php,Forms,Email,我为一个网站准备了一个简单的PHP电子邮件表单,但它经常发送空白电子邮件。大部分的字段都是“必需的”,我使用CAPTCHA系统有一段时间了,但是空白的电子邮件不断出现。 HTML标记: <form action="mail_send.php" method="post"> <input name="name" type="text" required="required" size="40" /> <input name="email" type="text"

我为一个网站准备了一个简单的PHP电子邮件表单,但它经常发送空白电子邮件。大部分的字段都是“必需的”,我使用CAPTCHA系统有一段时间了,但是空白的电子邮件不断出现。 HTML标记:

<form action="mail_send.php" method="post">

<input name="name" type="text" required="required" size="40" />

<input name="email" type="text" required="required" size="40" />

<input name="company" type="text" size="40" />

<textarea name="message" cols="80" rows="7" required="required"></textarea>

<input type="submit" value="Submit" />

</form>

PHP:

$name=$\u POST['name'];
$email=$_POST['email'];
$company=$_POST['company'];
$message=$_POST['message'];
$formcontent=“发件人:\n$name\n\n公司:\n$COMPANY\n\n消息:\n$MESSAGE”;
$recipient=“电子邮件地址”;
$subject=“subject”;
$mailheader=“From:$email\r\n”;
邮件($recipient,$subject,$formcontent,$mailheader)或死亡(“Error!”);
echo“window.location='confirmation.php';
当我测试它时,一切都很好,我从表单接收电子邮件时一点问题都没有,但出于某种原因,我经常收到空白电子邮件(可能是来自机器人)

有什么想法吗

谢谢


<textarea name="message" cols="80" rows="7" required="required"></textarea>
应该是

<textarea name="message" cols="80" rows="7" required></textarea>

你在写XHTML还是HTML


还建议在服务器端进行验证。请参阅下面关于如何操作的答案

如果HTML表单和PHP位于同一个文件中,而您没有检查这些输入是否为空,则可能会发生这种情况。如果不在同一个文件中,不检查是否为空,仍然适用

你可能是机器人的受害者,或者某个经常访问你的网站只是为了吓唬你的小丑

或者表单方法的URL被某人或某物直接访问,这就是我觉得这里可能存在的问题,因为您的输入确实需要

  • 检查您的访问日志
因此,请使用有条件的
!empty()
针对所有输入

即:

旁注:
|
检查一个或多个是否为空

if( !empty($_POST['name']) || !empty($_POST['email']) ){

   $name = $_POST['name'];
   $email = $_POST['email'];

   // process mail

}
您可以将其他的添加到中

或者为您的提交指定一个名称属性:

<input name="submit" type="submit" value="Submit" />

对于电子邮件输入,您还应使用过滤器:

另外,如果您以后决定使用收音机/复选框,请针对这些设备使用
isset()

旁注:

您可以在表单中添加一个复选框来检查它是否被选中,并使用条件语句来处理它


脚注:

“大部分的字段都是“必需的”,我使用CAPTCHA系统有一段时间了,但是空白的电子邮件不断出现。 您的问题中没有任何验证码来支持这一点

N.B.:

所需属性仅在支持HTML5的浏览器中有效。因此,如果你的站点上的任何机器人或访问者使用的浏览器不支持HTML5,或是可以绕过HTML5的技术,那么这也可能是另一个(促成)因素

但出于某种原因,你会收到空白电子邮件,可能是机器人发来的

基本上回答了你的问题。机器人可以相当先进,可以破解某些验证码,也可以发布空白帖子请求。您应该检查post请求是否为空


牢不可破的验证码是你自己写的(在你的网站变得流行之前不要传播)或者。试一试(一旦您检查了值)

您将希望在PHP上进行验证

基本上,您需要执行以下操作:

安全性

    <?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>
如果你想检查不止一件事,你可以让它变得更复杂一点

$fail_validation = FALSE;
if (empty($email)){
   $fail_validation = TRUE;

}
if (empty($phone)){
   $fail_validation = TRUE;

}
if ($fail_validation == FALSE){
  //code to send mail goes here
}

请注意,这是非常基本的,并且您可能需要考虑查看一些额外的函数来确保PHP。我还建议使用蜜罐作为额外的安全层。


这是指一个HTML错误,php不关心这个问题。即使如此,这在XHTML1.1中也是有效的。我假设它是HTML5。我假设它是HTML4.01,因为我看不到任何HTML5标记的引用。HTML4.01和HTML5之间的区别所需属性在HTML5中是新的。好吧,你说得对。他是在写XHTML,而不是HTMLIs——PHP页面与HTML页面分开?如果是这样的话,一个机器人就可以直接发布到这个URL,而不需要通过你的表单。我建议也在服务器端进行验证。@user2547075 PHP确实是独立的。我建议在服务器端放置重复的验证。永远不要相信客户!:)@user2547075我该怎么做?我刚刚发布了一个答案。希望有帮助!正如其中一个答案注释所述,OP在html代码中显示的required属性是有效的XHTML。(只要它是在doctype中定义的)看到表单上的输入元素只会巩固这个参数,就像在任何其他html类型中一样,它应该用
结束
/>
@Xorifelse OP应该发布完整的代码,然后向我们展示他们的文档声明是什么样子。到目前为止,OP还没有发表任何评论,所以这是任何人的游戏。@Fred ii-谢谢你的回复。我会落实你的建议。空白邮件几乎每天都会出现,如果它停止一两天,它可能会起作用。我尝试了谷歌的ReaPTCHA,但它并没有阻止发送空白邮件。我将尝试您的建议来检查空值。
    <?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>
if (!empty($email)){
    //your code to send email
}
$fail_validation = FALSE;
if (empty($email)){
   $fail_validation = TRUE;

}
if (empty($phone)){
   $fail_validation = TRUE;

}
if ($fail_validation == FALSE){
  //code to send mail goes here
}