Dove è un tool web che segue la catena di redirect di un URL e mostra dove porta davvero. Shortlink, link di tracciamento, URL sospetti: prima di cliccare, Dove segue la pista al posto tuo
  • Python 46.8%
  • CSS 24.1%
  • JavaScript 18.5%
  • HTML 10%
  • Dockerfile 0.6%
Find a file
2026-03-17 14:45:39 +01:00
app Qualche fix e miglioramento per abusi, aggiunta anche immagine per social sharing 2026-03-17 14:45:39 +01:00
.dockerignore Primo commit 2026-03-17 12:26:55 +01:00
.gitignore Primo commit 2026-03-17 12:26:55 +01:00
docker-compose.yml Primo commit 2026-03-17 12:26:55 +01:00
Dockerfile Primo commit 2026-03-17 12:26:55 +01:00
LICENSE Initial commit 2026-03-17 12:19:27 +01:00
README.md Aggiunto URL in readme 2026-03-17 12:30:09 +01:00
requirements.txt Primo commit 2026-03-17 12:26:55 +01:00

DOVE? — Yoota fiuta il tuo link

Dove è un tool web che segue la catena di redirect di un URL e mostra dove porta davvero. Shortlink, link di tracciamento, URL sospetti: prima di cliccare, Dove segue la pista al posto tuo.

Supporta redirect HTTP (301, 302, 303, 307, 308), meta-refresh HTML e i più comuni redirect JavaScript (window.location, location.href, location.replace).

Include anche un lettore di QR code integrato: trascini un'immagine con un QR, la decodifica avviene interamente nel browser (nessun file viene inviato al server) e se contiene un URL viene analizzato automaticamente.

Un progetto di Yoota.

Il tool è stato sviluppato con l'aiuto e il supporto morale di Claude.

DOVE usarlo?

Si può usare su dove.yoota.it.

Come funziona

  1. L'utente incolla un URL (o carica un QR code)
  2. Il server segue ogni redirect, uno alla volta, fino alla destinazione finale (massimo 10 hop)
  3. Per ogni passaggio mostra: URL, codice di stato HTTP, tipo di redirect, server, content-type
  4. La catena completa viene visualizzata graficamente nel browser

Stack

  • Backend: Python, FastAPI, httpx (async)
  • Frontend: HTML, CSS e JavaScript vanilla (zero framework, zero dipendenze esterne)
  • QR: jsQR, eseguito interamente lato client

Requisiti

  • Python 3.11+
  • Le dipendenze Python sono elencate in requirements.txt

Avvio rapido (sviluppo)

pip install -r requirements.txt
uvicorn dove.main:app --reload

Il tool sarà disponibile su http://localhost:8000.

Configurazione

Il comportamento si controlla tramite variabili d'ambiente:

Variabile Default Descrizione
DOVE_SECRET_KEY casuale Chiave crittografica per i token anti-bot
DOVE_TRUST_PROXY false Se true, usa X-Forwarded-For per identificare i client
DOVE_RATE_LIMIT 3 Richieste massime per client al minuto
DOVE_DAILY_LIMIT 100 Richieste massime per client al giorno

Limiti e scelte progettuali

  • Massimo 10 hop: se un URL passa per più di 10 redirect, la catena viene troncata. Nella pratica è più che sufficiente.
  • Timeout per singola richiesta: 3 secondi. Se un server non risponde in tempo, la catena si interrompe.
  • Timeout totale: 8 secondi per l'intera catena. Evita che richieste lente blocchino il server.
  • Nessun rendering JavaScript completo: il tool analizza solo redirect statici e pattern JS comuni (window.location = ...). Non esegue JavaScript: redirect generati da framework SPA o logiche complesse non vengono seguiti.
  • Solo HTTP/HTTPS: schemi come ftp://, mailto:, javascript: vengono rifiutati.
  • Rate limiting a tre livelli: per client (burst), globale, e giornaliero per client.
  • Nessun dato personale nei log: il tool registra solo timestamp e URL richiesti per monitorare il funzionamento. Non vengono salvati indirizzi IP né altri dati personali.
  • QR code lato client: la decodifica avviene nel browser. Il server non riceve mai l'immagine.

Sicurezza

Dove è progettato per essere esposto su Internet. Le protezioni attive includono:

  • Anti-SSRF: il resolver verifica che ogni URL punti a un indirizzo IP pubblico prima di effettuare la connessione. Reti private, loopback, link-local e indirizzi riservati vengono bloccati. Domini come .local, .internal, .onion e gli endpoint metadata cloud sono in blocklist.
  • Token anti-automazione: ogni sessione riceve un token HMAC con scadenza, legato al client. I bot non possono riutilizzare token generati per altri.
  • Honeypot: un campo nascosto nel form rileva i bot che compilano tutto.
  • Security headers: CSP restrittiva, X-Frame-Options DENY, no-referrer, Permissions-Policy.
  • Nessun endpoint di debug: OpenAPI/docs/redoc sono disabilitati.

Self-hosting

Se vuoi hostare una tua istanza di Dove, tieni presente:

  • Mettilo sempre dietro un reverse proxy (Caddy, Nginx, Traefik...) con HTTPS. Non esporre uvicorn/gunicorn direttamente.
  • Se attivi DOVE_TRUST_PROXY, assicurati che il reverse proxy sovrascriva l'header X-Forwarded-For e non faccia semplicemente append, altrimenti i client possono falsificarlo.
  • Imposta DOVE_SECRET_KEY con un valore fisso e segreto in produzione. Se lasci il default casuale, ogni riavvio invalida tutti i token attivi.
  • Valuta di aggiungere regole firewall per bloccare le connessioni in uscita verso reti private a livello di sistema operativo. Le protezioni applicative sono solide, ma un secondo livello a livello di rete è sempre una buona idea.
  • Se usi Docker, la chain DOCKER-USER di iptables è il punto giusto per questo tipo di regole.
  • I limiti di default sono conservativi. Adattali al tuo caso d'uso con le variabili d'ambiente.

Struttura del progetto

dove/
├── __init__.py
├── config.py          # Configurazione e variabili d'ambiente
├── main.py            # App FastAPI, endpoint, middleware
├── rate_limit.py      # Rate limiter in-memory (burst + giornaliero)
├── resolver.py        # Motore di risoluzione redirect
├── security.py        # Validazione URL, anti-SSRF, token HMAC
├── static/
│   ├── app.js         # Logica frontend
│   ├── style.css      # Stili
│   ├── jsqr.min.js    # Libreria QR (client-side)
│   └── images/        # Loghi e icone
├── templates/
│   └── index.html     # Template Jinja2
└── logs/              # Log di funzionamento (creata automaticamente)

Licenza

GPL-3.0 — vedi LICENSE.