You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP脚本运行的联系表单偶发空邮件接收问题排查求助

问题原因

你使用的HTML required 属性属于前端校验,仅在常规浏览器访问、用户正常操作时生效。大量自动化爬虫、恶意脚本可以直接跳过前端页面,直接向你的contact-form-handler.php接口发送空的POST请求,这是你每周收到空邮件的核心原因。前端校验只能优化正常用户的使用体验,永远不能作为提交内容的最终校验依据,所有校验逻辑必须在后端再做一次。


解决方案

  • 第一步(优先级最高):在PHP脚本中添加强制必填校验,同时过滤空白字符,校验不通过直接终止脚本、不发送邮件。修改后的PHP参考代码如下:
<?php
// 先校验请求方式是否为POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header("Location: index.html");
    exit;
}

// 接收参数并去除首尾空白,参数不存在时默认赋值为空字符串
$name = trim($_POST['name'] ?? '');
$visitor_email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');

// 校验三个字段是否非空,同时增加邮箱格式校验
if (empty($name) || empty($message) || !filter_var($visitor_email, FILTER_VALIDATE_EMAIL)) {
    // 校验不通过直接跳转,不发邮件
    header("Location: index.html");
    exit;
}

// 原有发邮件逻辑
$email_from = "SEND_EMAIL@ADDRESS.com";
$email_subject = "Message from fziastories";
$email_body = "Name: $name.\n".
    "Email: $visitor_email.\n".
    "Message: $message.\n";

$to = "RECIEVE_EMAIL@ADDRESS.com";
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $visitor_email \r\n";
mail($to,$email_subject, $email_body, $headers);
header("Location: index.html");
?>
  • 第二步:添加低干扰的反爬措施,优先推荐蜜罐方案:

    1. 在HTML表单中添加一个对普通用户隐藏的输入字段:
    <input name="honeypot" type="text" style="display:none" tabindex="-1" autocomplete="off">
    
    1. 在PHP校验逻辑中新增判断,如果$_POST['honeypot']不为空,说明是爬虫自动填充了所有字段,直接终止请求即可。
  • 第三步(可选补充):添加请求来源校验,在PHP开头判断请求的来源域名是否为你自己的站点,可拦截大部分无针对性的批量爬虫,注意该规则可被伪造,仅作为辅助防护手段。

  • 第四步(可选补充):添加提交频率限制,基于IP或者设备标识,限制同一个主体1分钟内最多提交1次表单,避免被恶意刷量。


内容的提问来源于stack exchange,提问作者Bilal Memon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:54:01