automatické počítačového uživatele od těch skutečných.“
- Vstříctnost
Netrestejte vaše návštěvníky, za to, že jsou lidmi! Váš návštěvník by měl být vaším pánem. - Žádný kanón na vrabce
Nevytvářejte hlavolamy, které návštěvníky akorát znechutí, odradí nebo mu průchod úplně znemožní. - Uživatelská přívětivost
Použijte příjemný způsob textové otázky, jejíž obsah můžete přizpůsobit cílové skupině návětěvníků. - Přístupnost
U obrázkových hlavolamů musíte obskurdním způsobem řešit přístupnost pro postižené návštěvníky. Přístupnost formulářů je už vyřešená na úrovni uživatelského rozhraní.
Použití v reálném provozu na leganto.cz
Co zde naleznete
Nabízené
Cílem této stránky je poskytnutí relevantních informací spolu s příklady řešení pro rozlišování počítačových programů od skutečných uživatelů (více CAPTCHA).
Po prostudování dokumentace by mírně pokročilý programátor neměl mít žádné obtíže s implementací ve svém oblíbeném programovacím jazyce.
Jednoduchost a univerzálnost
Jde o celkový koncept, který lze použít v jakékoliv aplikaci. Na této stránce jsou prezentovány způsoby implementace do webových stránek (pomocí PHP technologie). Koncept samotný však můžete použít kdekoliv.
Nezávislost
Nasazením textových otázek nejste závislí na této stránce ani nikom jiném. Pro poskytování otázek můžete použít různé rozhraní: vlastní vzdálený server, lokalní databázovou tabulku či jednoduché pole. Záleží pouze na velikosti projektu a požadované úrovni bezpečnosti.
Bezpečnost a „neprůstřelnost“
Předkládané řešení nemá za cíl zvýšit bezpečnost a býti „neprůstřelným“! Primárním cílem je propagovat „návštěvník, náš pán“. V mnoha případech je totiž CAPTCHA použitá zbytečně. V obhajitelných případech se ale volí uživatelsky zbytečně náročná řešení.
Dokumentace
Architektura
Podstata TextCaptchi je nahrazení obrázkového hlavolamu textovou otázkou s odpovědí triviální pro člověka. Například:
- Otázka: Je-li dneska čtvrtek, co bude pozítří za den?
Odpověď: Sobota nebo sobota - Otázka: Napište ovoce z preclík, šroubovák, kiwi, papír.
Odpověď: kiwi
Fungování klientské části:
- Před prvním vykreslením formuláře se požádá konkrétní implementace backendu o novou otázku.
- Načtená otázka se uloží do sezení (session).
- Vykreslí se formulář s otázkou a volným polem pro odpověď.
- Při odeslání se zkontroluje, zda návštěvníkem poskytnutá odpověď souhlasí s odpovědí uloženou v sezení.
- Pokud návštěvník zadal špatnou odpověď, požádá se o novou otázku.
- Jinak se pokračuje.
Fungování backendu (konkrétní implementace níže):
- Lokální – otázka se náhodně vybere z lokálních zdrojů, například pole, databázové tabulky apod.
- Vzdálené – požádá se vzdálený server o otázku.
Fungování serverové části:
- Obdržení požadavku na otázku.
- Kontrola platnosti API klíče
- Při neplatném klíči se hlásí chyba.
- Při platném klíči se náhodně vybere otázka a odešle ve předem domluveném formátu.
Doporučení pro vytváření otázek
- Otázka by měla být jednoduchá věta.
(Nevyhovující: Jaká je první číslice v čísle 123 pokud neuvažujeme první číslici.) - Nesmí být zkomplikována podmínkami.
(Nevyhovující: Jaká je první číslice v čísle 675, napište slovem, malými písmeny, bez diakritiky.) - Otázka by měla využívat znalosti do maximálně 5 třídy. Nejlepší je využívat znalosti používané často/každodenně.
(Nevyhovující: Která antický fyzik volal Heuréka?) - Nevyužívejte kulturní zvyklosti dané země ani jazykové hříčky. V českém prostředí berte v potaz velké množství Slováků.
(Nevyhovující: Čím čaruje pan Tau? V ČR ok, na Slovensku to neznají.) - U každé otázky zvažte všechny možné odpovědi, akceptovány by měli být odpovědi:
- Bez diakritiky
- S diakritikou
- Bez rozlišení velikosti písmen
- Pro čísla pak slovní alternativa (lze-li)
- Otázka je nevhodná, pokud na ni lze odpovědět příliš mnoha způsoby (cca víc než 3-4).
- Otázky by měli být netriviální, neměly by být přímo dohledatelné.
- Otázky by měly cílit spíše na operace, které jsou člověku vlastní a umí je rychle provádět.
Doporučení pro vytváření klienta
- Chraňte spojení otázky s odpovědí. Po dobu platnosti formuláře ukládejte odpověď do sezení (session)! (Zásadně neukládejte na straně klienta)
- Porovnávejte až po aplikaci lowercase a toAscii (zmenšíte si tím množství odpovědí při vytváření otázek).
Doporučení pro vytváření serveru
- Nevystavujte svůj server veřejně, zpřístupněte si jej pouze pro konkrétní přístupy.
- Na otázky, které posíláte v odpovědi ze serveru použijte hashovací funkci spolu s technikou solení. Výrazně tím předejdete vyzrazení odpovědí při úniku API klíče.
Ukázková řešení
Níže naleznete krátce zdokumentovaná ukázková řešení.
Klient pro Nette framework
Více na stránce rozšíření Nette.
Server v PHP
Jednoduchý poskytovatel otázek, který podporuje souběh více aplikací, vícejazyčnost. Umí spolupracovat se serverem (viz níže).
Požadavky:
- PHP 5.3
- MySQL 5.x databáze
- Hosting podporující Nette Framework
Veškeré zdrojové kódy najdete na projektové stránce.
GIT repozitář: git.yavanna.cz/textcaptcha.git.
Schéma databáze: /resources/api-scheme.sql
Zdrojové kódy (PHP 5.3): /web/api/
XML odpověď otázkou má následující formát:
<?xml version="1.0" encoding="UTF-8"?>
<captcha>
<question>Je nebe modré?</question>
<answer>2855e62ef4fc4259be786d653181d19a7df2bbb0</answer>
<answer>21d7ab5aa59d3d247898dffb37174179615d89bb</answer>
</captcha>
Vlastní implementace
Pokud nechcete začínat na zelené louce, můžete použít již naprogramované třídy (platí pouze pro PHP 5.3) z klienta pro Nette framework.
Následující třídy z /usage/Nette/TextCaptcha/ jsou bez externích závislostí:
- backend/ArrayBackend.php
- backend/IBackend.php
- backend/RemoteBackend.php
- other/IQuestion.php
- other/Question.php
- other/SaltedQuestion.php
Kontakt
Kontaktní údaje jsou k nalezení na www.jandrabek.cz.
