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

GAE第二代Python 3标准环境下动态验证Google Bot IP地址的可行性方案咨询

解决方案:在GAE第二代Python 3标准环境中动态验证Google Bot IP

完全可以实现动态验证!既然GAE标准环境限制了socket模块,我们可以用DNS over HTTPS (DoH) 来替代传统的socket DNS查询,通过HTTP请求完成反向/正向DNS验证,完全符合GAE的环境要求,而且不需要手动维护IP列表。

下面是具体的实现步骤和代码示例:

验证逻辑说明

Google官方验证Bot身份的标准流程是:

  1. 对访问IP执行反向DNS查询,获取对应的域名
  2. 对该域名执行正向DNS查询,确认返回的IP包含原访问IP
  3. 验证域名是否属于Google Bot(如以googlebot.com结尾)

我们用DoH来完成这两步查询,全程不依赖socket模块。

代码实现

首先,确保你的requirements.txt中包含requests(GAE标准环境支持这个第三方库):

requests>=2.31.0

然后在你的应用中添加验证函数:

import requests
from typing import Optional

# 使用Google官方的DNS over HTTPS服务
GOOGLE_DOH_URL = "https://dns.google/resolve"

def is_google_bot(ip_address: str) -> bool:
    # 第一步:反向PTR查询,将IP转换为PTR格式(如1.2.3.4 → 4.3.2.1.in-addr.arpa)
    ptr_domain = ".".join(reversed(ip_address.split("."))) + ".in-addr.arpa"
    try:
        ptr_response = requests.get(GOOGLE_DOH_URL, params={
            "name": ptr_domain,
            "type": "PTR"
        })
        ptr_response.raise_for_status()
        ptr_data = ptr_response.json()
    except requests.exceptions.RequestException:
        return False
    
    # 检查是否返回有效PTR记录,且域名属于Google Bot
    ptr_answers = ptr_data.get("Answer", [])
    if not ptr_answers:
        return False
    bot_domain = ptr_answers[0]["data"].strip('"')
    if not (bot_domain.endswith(".googlebot.com") or bot_domain.endswith(".google.com")):
        return False
    
    # 第二步:正向A查询,验证域名解析的IP包含原访问IP
    try:
        a_response = requests.get(GOOGLE_DOH_URL, params={
            "name": bot_domain,
            "type": "A"
        })
        a_response.raise_for_status()
        a_data = a_response.json()
    except requests.exceptions.RequestException:
        return False
    
    a_answers = a_data.get("Answer", [])
    return any(answer["data"] == ip_address for answer in a_answers)

集成到请求处理逻辑

在你的Web框架(比如Flask)中,获取客户端IP并添加前置验证:

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def check_google_bot():
    # 从GAE的反向代理头中获取真实客户端IP
    client_ip = request.headers.get("X-Forwarded-For", "").split(",")[0].strip()
    # 仅当用户代理声称是Google Bot时才进行验证
    user_agent = request.headers.get("User-Agent", "")
    if "Googlebot" in user_agent and not is_google_bot(client_ip):
        return "Forbidden", 403

# 你的业务路由示例
@app.route("/")
def home():
    return "Welcome to my site!"

if __name__ == "__main__":
    app.run()

额外优化建议

  • 缓存验证结果:DoH查询会增加请求延迟,建议用GAE的Memorystore或分布式缓存服务,对验证过的IP做短期缓存(比如1小时),减少重复查询
  • IPv6支持:如果你的网站支持IPv6,需要扩展代码处理IPv6的PTR格式(转换为ip6.arpa后缀的反向域名),并添加AAAA记录的查询逻辑
  • 日志记录:可以在异常分支添加日志,方便排查验证失败的请求

这样就实现了完全动态的Google Bot IP验证,无需手动跟踪IP列表变更,同时完美适配GAE第二代Python 3标准环境的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:42:33