Nová reCAPTCHA - Ako ju použiť?
V predchádzajúcej lekcii, Technika útoku SQL injection , sme sa zoznámili s útokom SQL injection.
Otravní roboti alebo nečitateľný text. Až doteraz problém väčšiny webmasterov, ktorí používali (alebo nepoužívali) captcha, konkrétne reCAPTCHA od Googlu. Ten ale vypustil novú verziu so sloganom "Tough on bots, Easy on humans" a my si v tomto článku ukážeme, ako ju použiť.
Ako nová captcha funguje?
Google vďaka tomu, že includujete jeho skript, môže sledovať pohyb kurzora užívateľa, klávesy, ktoré krčí a môže si zistiť aj operačný systém, prehliadač či rozlíšenie displeja. Až do chvíle, než zaškrtnete "Nie som robot" sa tieto údaje vyhodnocujú. Po zaškrtnutí sa odosielajú na server spolu s tým, čo vy beriete metódou GET (to identifikuje návštevníka). Po zaškrtnutí sa všetko vyhodnotí a Google vás buď prepustí, alebo vám na PC zobrazí starú reCAPTCHA, na mobile vyberáte zvieratká. Celé je to síce sofistikovaný systém, ale asi bude len chvíľu trvať, než sa i roboti naučia byť ľudskejší.
Registrácia
Ako prvý si na webe https://www.google.com/recaptcha/admin priradíme web, na ktorom chceme reCAPTCHA používať, pod svoj Google účet (je nutné byť prihlásený do akejkoľvek služby od Googlu). Potom web rozkliknite a pozrieme sa do kroku 1 - client-side integration (integrácia na strane klienta).
Integrácia
Do hlavičky webu si vložíme skript (upravený kvôli validite)
<script type="text/javascript" src="https://www.google.com/recaptcha/api.js"></script>
a tam, kde chceme mať formulár, vložíme kód, ktorý sme od Googlu získali (vy budete mať iný):
<div class="g-recaptcha" data-sitekey="6Lc-Uv8SAAAAAAKsjm2DKzA64jWNRGkea3GA-2OI"></div>
Odbili sme si tú ľahkú časť, teraz ideme hlbšie do kódu. Pred krokom jedna máme ešte Keys (kľúče). Rozbalíme a uvidíme niečo takéto:
Php
Vzhľadom k tomu, že je tento tutorial v sekcii PHP, budeme používať PHP. Vytvoríme si premenou reCAPTCHA, do ktorej dekódujú JSON súbor nachádzajúci sa na adrese: (VasSiteKey nahraďte vašim kľúčom)
https://www.google.com/recaptcha/api/siteverify?secret=VasSiteKey&response=get
PHP kód:
$recaptcha = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=ITnetwork.cz&response=' . $_POST['g-recaptcha-response']));
A kde že máme vziať response? Response na stránku odosiela reCAPTCHA pri odoslaní formulára pomocou POSTe a získame ho tak, ako je uvedené v kóde vyššie. Teraz už nám len zostáva overiť, či reCAPTCHA urobila z užívateľa robota alebo človeka. Urobíme to jednoduchým IFEMA, pretože či je alebo nie je človek rozhoduje v JSON len hodnota Success [bool].
if ($recaptcha->{'success'} == 'true') { echo('Uživatel je člověk.'); } else { echo('Uživatel není člověk.'); }
Aby toho nebolo málo, môžeme si hlásenie rozšíriť aj o konkrétnej chybu. Chyby sú celkom 4 a sú v JSON v parametri error-codes:
- missing-input-secret Secret kód nebol servera odovzdaný
- invalid-input-secret Secret kód je neplatný
- missing-input-response Odpoveď klienta nebola serveru odovzdaná
- invalid-input-response Odpoveď klienta je neplatná
Pridáme ich jednoducho:
if ($recaptcha->{'success'} == 'true') { echo('Uživatel je člověk.'); } else { echo('Uživatel není člověk.<br>'); if ($recaptcha->{'error-codes'}) { echo('Při ověřování nastala chyba: '); if ($recaptcha->{'error-codes'} == 'missing-input-secret') { echo('Secret kód nebyl serveru předán'); } elseif ($recaptcha->{'error-codes'} == 'invalid-input-secret') { echo('Secret kód je neplatný'); } elseif ($recaptcha->{'error-codes'} == 'missing-input-response') { echo('Odpověď klienta nebyla serveru předána'); } elseif ($recaptcha->{'error-codes'} == 'invalid-input-response') { echo('Odpověď klienta je neplatná'); } } }
Dúfam, že vám tento článok aspoň trochu pomohol a že z českého internetu zmizne otravné staré nečitateľné reCAPTCHA
Nakoniec bude web vyzerať takto:
Ak sa Googlu zdať nebudete, vybafne na vás opäť stará klasická captcha.V ďalšej lekcii, Útok CSRF (Cross Site Request Forgery) a ako sa brániť , sa zoznámime s útokom Cross Site Request Forgery a uvedieme si spôsoby ako sa pred týmto typom útoku brániť.