Ruby on Rails
Для максимально эффективной интеграции ProxyTracer в приложение Rails мы полностью минуем слой контроллеров и создаем кастомный Rack Middleware. Он перехватывает сырой HTTP-запрос до того, как тот попадет в маршрутизатор Rails.
Rack Middleware
Этот middleware использует встроенный объект 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. Выполнить запрос к API ProxyTracer со строгим таймаутом 500 мс
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Конфигурация
Чтобы включить защиту глобально, добавьте middleware в стек приложения в файле config/application.rb:
module YourApp
class Application < Rails::Application
# ...
# Разместить в самом верху стека для раннего отклонения нежелательного трафика
config.middleware.insert_before Rack::Sendfile, ProxyTracerMiddleware
# ...
end
endПоследнее обновление: