Ruby on Rails
Ruby on Rails は Rack ミドルウェアスタックを使用して、リクエストが Action Dispatch ルーティング層に到達する前に処理を行います。ProxyTracer を Rack パイプラインに挿入することで、Rails アプリケーション内で直接プロキシ検出を実行できます。
Rackミドルウェア
この Rack ミドルウェアは request.ip を検証し、Ruby 標準の Net::HTTP を使用して ProxyTracer API をクエリして、プロキシが識別された場合に 403 Forbidden レスポンスで実行を停止します。
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. 厳格な500msのタイムアウトを設定してProxyTracer APIにクエリを実行
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
# フェイルオープン: エラーをログに記録し、リクエストの進行を許可
Rails.logger.error("ProxyTracer validation failed: #{e.message}")
end
end
# 4. トラフィックは正常です。Rackスタックを進んでRailsルーターへ処理を渡します
@app.call(env)
end
end設定:
設定手順: このファイルを app/middleware/proxy_tracer_middleware.rb に保存し、config/application.rb 内でミドルウェアスタックに挿入します: config.middleware.use ProxyTracerMiddleware。
module YourApp
class Application < Rails::Application
# ...
# スタックの上位に挿入して不正なトラフィックを早い段階で拒否
config.middleware.insert_before Rack::Sendfile, ProxyTracerMiddleware
# ...
end
end最終更新日: