Skip to Content

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
最終更新日: