„Projekt Text Captcha se snaží nabídnout alternativní způsob jak rozlišovat
automatické počítačového uživatele od těch skutečných.“
 
Použití v reálném provozu na leganto.cz 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:

Fungování klientské části:

  1. Před prvním vykreslením formuláře se požádá konkrétní implementace backendu o novou otázku.
  2. Načtená otázka se uloží do sezení (session).
  3. Vykreslí se formulář s otázkou a volným polem pro odpověď.
  4. 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):

  1. Lokální – otázka se náhodně vybere z lokálních zdrojů, například pole, databázové tabulky apod.
  2. Vzdálené – požádá se vzdálený server o otázku.

Fungování serverové části:

  1. Obdržení požadavku na otázku.
  2. 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

  1. Otázka by měla být jednoduchá věta.
    (Nevyhovující: Jaká je první číslice v čísle 123 pokud neuvažujeme první číslici.)
  2. 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.)
  3. 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?)
  4. 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í.)
  5. 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)
  6. Otázka je nevhodná, pokud na ni lze odpovědět příliš mnoha způsoby (cca víc než 3-4).
  7. Otázky by měli být netriviální, neměly by být přímo dohledatelné.
  8. 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

  1. 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)
  2. 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

  1. Nevystavujte svůj server veřejně, zpřístupněte si jej pouze pro konkrétní přístupy.
  2. 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

Ukázka z provozu

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:

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í:

Kontakt

Kontaktní údaje jsou k nalezení na www.jandrabek.cz.