【问题标题】:PHP email form shooting blank emailsPHP电子邮件表单拍摄空白电子邮件
【发布时间】:2016-06-07 09:28:58
【问题描述】:

我为一个网站整理了一个简单的 PHP 电子邮件表单,但它经常发送空白电子邮件。大多数字段都是“必填”的,我使用了一段时间的验证码系统,但空白电子邮件不断出现。

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 = $_POST['name'];
$email = $_POST['email'];
$company = $_POST['company'];
$message = $_POST['message'];
$formcontent=" FROM:\n $name \n\n COMPANY:\n $company \n\n MESSAGE:\n $message";
$recipient = "email address";
$subject = "Subject";
$mailheader = "From: $email \r\n";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");

echo "<script>window.location = 'confirmation.php'</script>";

当我测试它时一切正常,我收到来自表单的电子邮件完全没有问题,但由于某种原因,我经常收到空白电子邮件(可能来自机器人)。

有什么想法吗?

谢谢!

【问题讨论】:

  • PHP页面和HTML页面是分开的吗?如果是这样,机器人可以直接发布到该 URL 而无需通过您的表单。我建议也做验证服务器端。
  • @user2547075 PHP 确实是独立的。
  • 我建议将重复验证服务器端。永远不要相信客户! :)
  • @user2547075 我该怎么做?
  • 我刚刚发布了一个答案。希望能帮助到你! stackoverflow.com/a/35656086/2547075

标签: php forms email


【解决方案1】:

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

您可能是爬虫程序的受害者,也可能是某个小丑经常访问您的网站,只是为了勾引您。

或者表单的方法的 URL 正在被某人或某物直接访问,我认为这可能是这里的问题,因为您的输入确实有 required

  • 检查您的访问日志。

因此,对所有输入使用条件 !empty()

即:

旁注:|| 检查一个或任何一个是否为空。

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

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

   // process mail

}

你可以添加其他的。

或者给你的提交一个名称属性:

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

然后检查按钮是否设置,输入是否为空:

if(isset(_POST['submit'])){

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

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

       // process mail

    }

}

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

另外,如果您以后决定使用单选框/复选框,请使用 isset() 反对这些。

旁注:

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


脚注:

“大部分字段都是“必填”,我使用了一段时间的验证码系统,但空白电子邮件不断出现。”

您的问题中没有任何验证码支持这一点。

注意:

required 属性仅适用于支持 HTML5 的浏览器。因此,如果您网站的任何这些机器人或访问者使用的浏览器不支持 HTML5 或可以绕过它的技术,那么这也可能是另一个(促成)因素。

【讨论】:

  • 如答案 cmets 之一所述,OP 在 html 代码中显示的必需属性是有效的 XHTML。 (只要它在 doctype 中定义)在他的表单上看到输入元素只会巩固这个论点,因为在任何其他 html 类型中它应该用&lt;/input&gt; 关闭而不是/&gt;
  • @Xorifelse OP 应该发布完整的代码并向我们展示他们的文档声明的样子。在这一点上,OP 还没有在任何地方发表评论,所以这是任何人的游戏。
  • @Fred-ii- 感谢您的回复。我会落实你的建议。空白电子邮件几乎每天都会收到,如果它停止一两天,它可能会起作用。
【解决方案2】:

您需要对您的 PHP 进行验证。

http://www.w3schools.com/php/php_form_validation.asp

基本上你会想要做以下事情:

安全

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

请注意,这是非常基本的,您可能需要考虑研究一些额外的功能来保护 PHP。我还建议使用蜜罐作为额外的安全层。 https://stackoverflow.com/a/22103646/2547075

【讨论】:

    【解决方案3】:
    <textarea name="message" cols="80" rows="7" required="required"></textarea>
    

    应该是

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

    您是在编写 XHTML 还是 HTML?

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

    【讨论】:

    • 这是指HTML错误,php不关心这个。即便如此,这在 xhtml 1.1 中仍然有效。
    • 他说的是 HTML。我会假设它的 html 5.
    • 我会假设 html 4.01,因为我看不到任何 html 5 标记的引用。
    • HTML 4.01 和 HTML5 的区别 HTML5 中新增 required 属性。
    • 好吧,你是对的。他正在编写 XHTML,而不是 HTML
    【解决方案4】:

    但由于某种原因,您收到了可能来自机器人的空白电子邮件

    几乎回答了你的问题。机器人可以非常先进,并且可以破坏某些验证码以及发布空白帖子请求。您应该检查发布请求是否不为空。

    牢不可破的验证码是您自己编写的验证码(在网站流行之前不会传播到您的网站)或the recently introduced one from Google。试一试(一旦你检查了empty 值)

    【讨论】:

    • 我尝试了谷歌的recaptcha,但它并没有阻止发送空白电子邮件。我会尝试你的建议来检查空值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多