Shugoi Ruby (Rails)

Protection anti-abus Shugoi pour Ruby on Rails — parité complète avec le module Node shugoi.

Bloque les bots, scrapers et clients headless avec :

  • Pre-flight PoW challenge (307 + tableau ASCII pour curl/view-source, JS de résolution inline pour les navigateurs)
  • Machine fingerprinting (guard-detect) + whitelist
  • Render-grant HMAC (lié au siteKey + token + IP + TTL) — anti-bypass "token-only"
  • Split-render : skeleton unicode injecté dans la page, remplacé par le contenu réel après vérification

Installation

# Gemfile
gem "shugoi"

Configuration (Rails)

# config/initializers/shugoi.rb
Shugoi.configure do |config|
  config.site_key = "sg_sk_live_…"
  config.secret = ""              # secret du site (signature des tokens)
  config.debug = Rails.env.development?
  # config.base_url = "https://shugoi.com/api/v1"
  # config.allowlist = ["/api", "/legal"]
end

Le railtie monte automatiquement le middleware sur l'app Rails.

Usage Rack pur

# config.ru
require "shugoi"
use Shugoi, site_key: "sg_sk_live_…", signing_secret: ""
run MyApp

Options

Option Défaut Description
site_key Votre siteKey Shugoi (requis)
secret Secret du site
signing_secret secret Secret HMAC de signature
base_url https://shugoi.com/api/v1 API Shugoi
allowlist ["/api", "/legal"] Chemins sans protection
auto_inject true Injecte les guards dans le HTML
split_render true Skeleton + render
restricted_access false Page d'accès restreint
pow_difficulty 10 Bits du proof-of-work
debug false Logs console

Tests

bundle install
bundle exec rspec

Parité avec le module Node

Le flux réplique exactement shugoi 0.3.6 (npm) :

  • core.evaluate → challenge 307 / /__sg_challenge / blocage headless
  • injectGuardScripts → token signé + skeleton unicode
  • renderResponseData → vérification grant + token, service du HTML stocké
  • verifyRenderGrant → format base36(ts):HMAC(secret, "render-grant:siteKey:mid:token:ip:ts")