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"); ?>
第二步:添加低干扰的反爬措施,优先推荐蜜罐方案:
- 在HTML表单中添加一个对普通用户隐藏的输入字段:
<input name="honeypot" type="text" style="display:none" tabindex="-1" autocomplete="off">- 在PHP校验逻辑中新增判断,如果
$_POST['honeypot']不为空,说明是爬虫自动填充了所有字段,直接终止请求即可。
第三步(可选补充):添加请求来源校验,在PHP开头判断请求的来源域名是否为你自己的站点,可拦截大部分无针对性的批量爬虫,注意该规则可被伪造,仅作为辅助防护手段。
第四步(可选补充):添加提交频率限制,基于IP或者设备标识,限制同一个主体1分钟内最多提交1次表单,避免被恶意刷量。
内容的提问来源于stack exchange,提问作者Bilal Memon
相关产品推荐
相关产品推荐

