Skip to Content

Ruby on Rails

Pour intégrer ProxyTracer dans une application Rails avec une efficacité maximale, nous contournons complètement la couche du contrôleur et construisons un Rack Middleware personnalisé. Cela intercepte la requête HTTP brute avant qu'elle n'entre dans le routeur Rails.

Intergiciel Rack

Cet intergiciel exploite l'objet natif Rack::Request pour extraire l'IP en toute sécurité (en gérant automatiquement les en-têtes usurpés) et utilise la bibliothèque standard Net::HTTP de Ruby pour imposer un délai d'attente strict.

require 'net/http' require 'json' class ProxyTracerMiddleware def initialize(app) @app = app @api_key = ENV['PROXYTRACER_API_KEY'] end def call(env) # 1. Extraire l'IP (Rack assainit automatiquement X-Forwarded-For) request = Rack::Request.new(env) ip = request.ip # Ignorer en développement local 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. Interroger l'API ProxyTracer avec un timeout strict de 500 ms 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. Interrompre immédiatement la connexion si un proxy est détecté if data['proxy'] == true return [ 403, { 'Content-Type' => 'application/json' }, ['{"error": "Access Denied: VPN or Proxy detected."}'] ] end end rescue StandardError => e # Fail open : journaliser l'erreur et autoriser la requête à se poursuivre Rails.logger.error("ProxyTracer validation failed: #{e.message}") end end # 4. Le trafic est sain, poursuivre dans la pile Rack vers le routeur Rails @app.call(env) end end

Configuration :

Pour activer la protection globalement, insérez l'intergiciel dans votre pile d'applications à l'intérieur de config/application.rb:

module YourApp class Application < Rails::Application # ... # L'insérer haut dans la pile pour rejeter le trafic indésirable au plus tôt config.middleware.insert_before Rack::Sendfile, ProxyTracerMiddleware # ... end end
Dernière mise à jour le