Ruby on Rails
ProxyTracer를 Rails 애플리케이션에 최대의 효율성으로 통합하기 위해 컨트롤러 계층을 완전히 우회하고 맞춤형 랙 미들웨어를 구축합니다. 이는 Rails 라우터에 들어가기 전에 원시 HTTP 요청을 가로챕니다.
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. 엄격한 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
# Fail open: 오류를 기록하고 요청 진행 허용
Rails.logger.error("ProxyTracer validation failed: #{e.message}")
end
end
# 4. 정상 트래픽인 경우 Rack 스택을 거쳐 Rails 라우터로 전달
@app.call(env)
end
end구성:
전역적으로 보호를 활성화하려면 config/application.rb 내부의 애플리케이션 스택에 미들웨어를 삽입하세요.
module YourApp
class Application < Rails::Application
# ...
# 악성 트래픽을 조기에 차단하기 위해 스택 상단에 삽입
config.middleware.insert_before Rack::Sendfile, ProxyTracerMiddleware
# ...
end
end최종 수정일: