Ruby on Rails
为了以最高效率将 ProxyTracer 集成至 Rails 应用,我们完全绕过控制器层,构建自定义 Rack 中间件。该中间件在原始 HTTP 请求进入 Rails 路由器之前即完成拦截验证。
Rack 中间件
此中间件利用原生的 Rack::Request 对象安全提取 IP(自动防范伪造请求头),并借助 Ruby 标准 Net::HTTP 库强制执行严格超时。
require 'net/http'
require 'json'
class ProxyTracerMiddleware
def initialize(app)
@app = app
@api_key = ENV['PROXYTRACER_API_KEY']
end
def call(env)
# 1. 提取 IP(Rack 会自动对 X-Forwarded-For 进行清理过滤)
request = Rack::Request.new(env)
ip = request.ip
# 跳过本地开发环境
if ip && !['127.0.0.1', '::1'].include?(ip)
begin
uri = URI("https://api.proxytracer.com/v1/check/#{ip}")
req = Net::HTTP::Get.new(uri)
req['Authorization'] = "Bearer #{@api_key}"
# 2. 查询 ProxyTracer API(配置严格的 500ms 超时)
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: 0.5) do |http|
http.request(req)
end
if response.is_a?(Net::HTTPSuccess)
data = JSON.parse(response.body)
# 3. 若检测到代理,立即丢弃连接
if data['proxy'] == true
return [
403,
{ 'Content-Type' => 'application/json' },
['{"error": "Access Denied: VPN or Proxy detected."}']
]
end
end
rescue StandardError => e
# 故障开放(Fail-open):记录错误并允许请求继续进行
Rails.logger.error("ProxyTracer validation failed: #{e.message}")
end
end
# 4. 流量正常,沿 Rack 中间件栈继续传递至 Rails 路由器
@app.call(env)
end
end配置说明:
若需全局启用防护,请在 config/application.rb 中将该中间件插入应用程序的 Rack 中间件堆栈:
module YourApp
class Application < Rails::Application
# ...
# 将其置于调用栈的前列,以及早拦截恶意流量
config.middleware.insert_before Rack::Sendfile, ProxyTracerMiddleware
# ...
end
end最后更新于