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

如何阻止Google Bot或其他爬虫用已提交信息重复提交HTML表单?

解决Google Bot疑似重复提交表单的问题

我之前帮好几个开发者排查过几乎一模一样的问题——核心原因其实是搜索引擎爬虫(大概率是Google Bot)在重新抓取旧页面快照时,误触发了表单的提交请求,但因为爬虫不会执行前端JS,所以你的第三方onClick同步脚本完全没跑起来,这就解释了为什么数据库和邮件会重复生成条目,但仪表盘没数据的矛盾点。

下面是按优先级排序的解决方案和实战经验:

1. 用JS动态Token验证区分真实用户和爬虫(最有效)

爬虫的核心短板是不执行前端JS,所以我们可以利用这一点做验证:

  • 前端:在表单里加一个隐藏的input,页面加载完成后用JS给它赋值一个随机token,同时把这个token存在用户的Session里。
    <input type="hidden" id="form-token" name="form_token">
    <script>
      window.onload = function() {
        const token = Math.random().toString(36).substring(2, 15);
        document.getElementById('form-token').value = token;
        // 也可以让后端在渲染页面时先生成token存在Session,前端直接读取
      };
    </script>
    
  • 后端(PHP):接收表单提交时,先验证$_POST['form_token']是否和$_SESSION['form_token']匹配,不匹配直接拒绝提交。
    session_start();
    if (!isset($_POST['form_token']) || $_POST['form_token'] !== $_SESSION['form_token']) {
      header("HTTP/1.1 403 Forbidden");
      exit("Invalid request");
    }
    // 验证通过后销毁token,防止重复使用
    unset($_SESSION['form_token']);
    

这个方法直接从根源区分了真实用户(会执行JS)和爬虫(不会执行JS),比robots.txt靠谱太多,因为爬虫根本拿不到有效的token。

2. 给表单提交加重复内容时间限制

针对你提到的“1-2分钟内连续8次重复提交”的特征,可以在后端做内容去重+时间限制:

  • 把表单里的关键字段(比如姓名、邮箱、电话)组合起来生成一个哈希值:
    $content_hash = md5($_POST['name'] . $_POST['email'] . $_POST['phone']);
    
  • 然后查询数据库,看看最近10分钟内是否有相同的哈希值存在,如果有就直接拒绝提交:
    $stmt = $pdo->prepare("SELECT id FROM form_submissions WHERE content_hash = ? AND created_at >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)");
    $stmt->execute([$content_hash]);
    if ($stmt->rowCount() > 0) {
      exit("Duplicate submission detected");
    }
    

这个方法既能防爬虫重复提交,也能防止真实用户误点多次提交。

3. 修正robots.txt和页面爬虫规则(辅助手段)

之前的robots.txt可能没写到点子上,你需要禁止爬虫访问表单处理的PHP页面,而不仅仅是表单展示页面:

User-agent: *
Disallow: /your-form-handler.php  // 替换成你的表单解析页面路径

同时在表单展示页面的头部加meta标签,告诉爬虫不要索引或追踪这个页面:

<meta name="robots" content="noindex, nofollow">

不过要注意:这只是“君子协定”,有些爬虫会忽略,所以只能作为辅助,不能依赖它。

4. 调整表单提交的触发逻辑

你的第三方脚本是绑定在onClick事件上的,说明真实提交是通过按钮点击触发的,而爬虫可能直接POST了表单的action URL。可以把提交按钮改成普通按钮,通过JS来触发提交:

<button type="button" id="submit-btn">提交</button>
<script>
  document.getElementById('submit-btn').addEventListener('click', function() {
    // 先执行第三方同步脚本
    thirdPartySyncFunction();
    // 再提交表单
    document.getElementById('your-form').submit();
  });
</script>

这样一来,爬虫直接POST action URL的话,不仅拿不到JS生成的token,也不会触发第三方脚本,后端验证token时直接拦截。

实战经验分享

  • 遇到这种“重复提交真实内容”的情况,别先想着防垃圾邮件,核心是区分真实用户行为和自动化请求——爬虫不执行JS是最核心的差异点,抓住这个就能解决大部分问题。
  • robots.txt和meta标签是防君子不防小人,必须要有后端验证作为兜底。
  • 不要只用IP限制,因为真实用户可能用动态IP,而爬虫可能用大量不同IP,结合JS Token+内容哈希+时间戳的组合验证才是最稳妥的。

内容的提问来源于stack exchange,提问作者Dave O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:23