- Python 46.8%
- CSS 24.1%
- JavaScript 18.5%
- HTML 10%
- Dockerfile 0.6%
| app | ||
| .dockerignore | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| requirements.txt | ||
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
- L'utente incolla un URL (o carica un QR code)
- Il server segue ogni redirect, uno alla volta, fino alla destinazione finale (massimo 10 hop)
- Per ogni passaggio mostra: URL, codice di stato HTTP, tipo di redirect, server, content-type
- 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,.onione 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'headerX-Forwarded-Fore non faccia semplicemente append, altrimenti i client possono falsificarlo. - Imposta
DOVE_SECRET_KEYcon 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-USERdi 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.