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身份的标准流程是:
- 对访问IP执行反向DNS查询,获取对应的域名
- 对该域名执行正向DNS查询,确认返回的IP包含原访问IP
- 验证域名是否属于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
相关产品推荐
相关产品推荐

