Tor 只是作为匿名透明 HTTP 代理重复请求,这意味着它不附加典型的代理标头(例如Via
or X-Forwarded-For
),或以任何其他方式修改 HTTP 请求或响应(除了通过 Tor 网络“洋葱路由、加密和解密”)。
至于识别通过 Tor 网络连接的客户端,在 Web 服务器端最容易检测到此类客户端的方法是查询发布 Tor 出口节点的公共TorDNSEL 服务:
TorDNSEL 是一个活跃的测试,基于 DNS 的 Tor 出口节点列表。由于 Tor 支持退出策略,网络服务的 Tor 退出列表是其 IP 地址和端口的函数。与传统的 DNSxL 不同,服务需要在其查询中提供该信息。
以前的 DNSEL 会从 Tor 的网络目录中抓取出口节点 IP 地址,但这种方法无法列出不在目录中公布其出口地址的节点。TorDNSEL 通过这些节点主动测试以提供更准确的列表。
这种 TorDNSEL 查询可以在您的 Web 应用程序中自动进行,并且可以在 Internet 上找到许多编程语言的示例代码。例如,这里有一些示例代码演示了如何在 PHP 中执行此操作。
如果你打算在你的 web 应用程序中实现这个 Tor 检查,那么我建议你在本地缓存查询结果一段时间,期望出口节点在此期间没有改变是合理的,不要不断重复相同的查询并添加一个您的回复有额外的滞后。
编辑添加:优化此 Tor 出口节点查询并避免一直使用 TorDNSEL 的另一种方法是事先进行反向 DNS 查找,并尝试将其与已知的主要 Tor 出口节点主机列表进行匹配。这实际上非常有效,因为许多主要出口节点主机永远不会改变,并且它们可以使用相同或相似的 rDNS 名称操作大量出口节点。例如,您可以尝试使用正则表达式、LIKE
SQL 运算符或类似方法将 rDNS 名称与您的列表匹配。一些已知的 Tor 出口节点主机(真实示例)将匹配这些名称:
tor[0-9].*
tor-exit*
*.torservers.*
*.torland.is
这是我正在使用的列表。如您所见,它远未完成,但它只是一个开始,您始终可以在检测到它们遵循易于匹配的模式时添加更多条目。由于它只是为了优化查询,它实际上并不需要完整,但每次匹配肯定会加快速度。希望这可以帮助!