no, non sbagli, ad esempio google usa le immagini e diversi quesiti. Non sono gli ultimi arrivati e sanno quello che fanno... perché il problema non è riuscire a reperire il dato (quello lo devi passare per forza!), ma riuscire ad interpretarlo.
Come detto in precedenza se io al client do un dato testuale non sto facendo nulla per far si che la macchina abbia difficoltà a riconoscerlo, cosa diversa se li fornisco un array di byte (ovvero un immagine) e devo farli interpretare un quesito, allora avrà difficoltà la macchina.
In entrambe i casi il dato lo manda il client a suo piacimento, ma nel caso di google c'è qualche "complessità" in più in quanto la comunicazione non avviene diretta al server (tuo), ma il risultato dell'operazione la valuta il server di google (viene inviata dal client a google tramite una chiamata in background), infatti se osservi noterai che il tutto si può svolgere anche senza postback (ti da l'esito senza chiamare il tuo server) e poi google restituirà al client un codice per l'operazione, poi una volta che la richiesta contenente il recaptcha (ad esempio un form) e il codice restituito da google arriva al server (ora il tuo), sarà questo a chiedere a google tramite una chiamata alle webapi di google (passando ovviamente il codice restituito dall'operazione effettuata su recaptcha) se con quel codice specifico tutto è andato bene oppure no. Dopo lato server decidi cosa fare: puoi farlo passare oppure vedi tu poi che fare lato server (ad esempio reindirizzarlo ad una pagina di errore). Ovviamente puoi anche fare in modo che se non passa non fai partire il form dal client (blocco sul client), ma questo metodo è utile solo se il controllo lo fai anche server, diciamo come "cortesia" per evitare un invio a vuoto, se no, come già detto, al server lo posso inviare comunque anche se la tua pagina me lo vieta tramite script lato client.