I CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) sono uno degli "ostacoli" più diffusi nel web. Servono a distinguere utenti reali dai bot e sono utilizzati da siti web per prevenire spam, abusi, scraping automatizzato e altri comportamenti indesiderati.
Ma cosa succede quando uno sviluppatore ha un bisogno legittimo di accedere a dati pubblici da un sito web che impone un CAPTCHA? O quando si lavora nel campo del testing automatico, dell'accessibilità, o della ricerca sull'intelligenza artificiale?
In questo articolo vedremo come funziona il bypass dei CAPTCHA attraverso headless browsing e tecniche di AI, in un contesto etico, didattico e legale. Il nostro obiettivo è informare, non incoraggiare l'abuso.
Cos'è un CAPTCHA?
I CAPTCHA sono test progettati per essere difficili da superare per le macchine ma semplici per gli esseri umani. I tipi più comuni includono:
- testo distorto
- reCAPTCHA di Google (v2: clic su "Non sono un robot", v3: punteggio invisibile)
- Immagine (seleziona immagini con semafori, auto, ecc.)
- Puzzle o slider CAPTCHA
- hCaptcha, alternativa open source a reCAPTCHA
- Puppeteer
PlaywrightSelenium
Il progresso dell'intelligenza artificiale ha reso questi sistemi sempre più sofisticati. Tuttavia, anche gli strumenti per automatizzare l'interazione con essi si sono evoluti.
Headless Browsing: la base dell'automazione
Un headless browser è un browser web privo di interfaccia grafica, controllabile via codice. Questo consente agli sviluppatori di automatizzare la navigazione come se fosse un utente reale. I più noti sono:
Un esempio con Puppeteer:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox']
});
const page = await browser.newPage();
await page.goto('https://example.com');
// Simula comportamento umano
await page.waitForTimeout(2000);
await page.type('#email', 'example@example.com');
await page.click('#submit');
await browser.close();
})();
Questo codice non bypassa CAPTCHA ma mostra come simulare un utente.
Tecniche per aggirare i CAPTCHA
Non esistono soluzioni magiche, ma ci sono approcci differenti in base al tipo di "ostacolo" da superare. Una possibilità è quella di evitare il CAPTCHA (strategia soft), spesso infatti essi si attivano dopo troppe richieste rapide o da IP sospetti.
Ma passiamo ai "trucchi legittimi":
- Limitare la frequenza delle richieste (Rate Limiting).
- Usare proxy residenziali affidabili.
- Impostare
User-AgentAccept-LanguageReferrer - Simulare i movimenti di mouse e tastiera
await page.mouse.move(100, 100);
await page.keyboard.type('ciao');
Se invece si vogliono utilizzare dei servizi di riconoscimento, esistono API che decifrano i CAPTCHA tramite AI o interventi manuali. Ecco alcuni esempi di servizi (a pagamento):
- 2Captcha
- AntiCaptcha
- CapMonster
- DeathByCaptcha
Integrazione con 2Captcha (un esempio con reCAPTCHA):
const axios = require('axios');
async function solveCaptcha(siteKey, pageUrl, apiKey) {
const submitUrl = `http://2captcha.com/in.php?key=${apiKey}&method=userrecaptcha&googlekey=${siteKey}&pageurl=${pageUrl}`;
const res = await axios.get(submitUrl);
const requestId = res.data.split('|')[1];
await new Promise(r => setTimeout(r, 20000)); // Attendi la risoluzione
const resultUrl = `http://2captcha.com/res.php?key=${apiKey}&action=get&id=${requestId}`;
const result = await axios.get(resultUrl);
const token = result.data.split('|')[1];
return token;
}
Nel browser headless userai successivamente il token per simulare il completamento del CAPTCHA.
AI e OCR per CAPTCHA visivi
CAPTCHA basati su testo distorto possono essere risolti tramite OCR (Optical Character Recognition). Alcuni degli strumenti più utili sono:
Tesseract.jsJavaScript- Python
Di seguito un esempio con tesseract.js:
const Tesseract = require('tesseract.js');
Tesseract.recognize(
'captcha.png',
'eng',
{ logger: m => console.log(m) }
).then(({ data: { text } }) => {
console.log('Testo riconosciuto:', text);
});
Ovviamente, il successo dipende dalla qualità dell'immagine e dal tipo di distorsione.
Etica e legalità
Bypassare CAPTCHA può violare i "Termini di Servizio" di molti siti web. L'utilizzo di questi metodi deve essere limitato a contesti di test, ricerca o automazione lecita, come:
- QA automatizzato per web app protette da CAPTCHA.
- Accesso a dati pubblici quando il sito fornisce consenso (o API).
- Test di accessibilità o usabilità.
- Formazione e dimostrazioni tecniche.
Mai usarli per scraping massivo, furto di dati, spam o frodi.
Tecniche difensive: proteggersi dai bot
Conoscere queste tecniche è utile anche per difendere i propri progetti. Ecco alcune contromisure:
- Integrare CAPTCHA solo quando necessario.
- Adottare reCAPTCHA v3 (invisibile, punteggio comportamentale).
- Combinare CAPTCHA con altri sistemi (token CSRF, honeypot, fingerprinting).
- Honeypot fields: campi nascosti che solo i bot riempiono.
- Token di sessione temporanei.
- reCAPTCHA v3, invisibile e più fluido.
- Protezione lato server (rate limiter, AI..).
Alternative ai CAPTCHA per una UX più performante
Il problema dei CAPTCHA è che spesso penalizzano l'utente legittimo. Alcune alternative includono:
Conclusione
Bypassare i CAPTCHA con tecniche di headless browsing e AI è possibile ma richiede una comprensione profonda di come funzionano i meccanismi di protezione online. Saperlo fare è utile per chi lavora nel testing, nella sicurezza informatica, nell'accessibilità e nella ricerca AI. Va però sempre tenuto presente che il confine tra uso lecito e abuso è molto sottile.
L'obiettivo di questo articolo è fornire consapevolezza e strumenti per interagire con questi sistemi in modo etico. Se sviluppi applicazioni web, imparare a proteggerti da questi meccanismi è fondamentale tanto quanto saperli usare in fase di test. Se invece lavori nell'automazione o nella data analysis, il tuo compito è sempre rispettare i dati, le fonti e le regole del gioco.
La tecnologia è potente ma va usata con intelligenza e rispetto. Sapere come funziona un CAPTCHA, anche nei suoi aspetti più nascosti, fa parte della conoscenza di ogni sviluppatore.