Spamový filtr využívá databázi MySQL a GD knihovnu pro generování obrázků ve formátu PNG. Dosud běžné ochrany proti spamu v diskusích i jinde využívaly jeden obrázek, který byl špatně čitelný pro technologie OCR rozpoznávající znaky. Podle mě se dříve nebo později dopracuje technologie OCR k tomu, že bude možná i dokonalejší než schopnosti člověka daný text přečíst. Dokonce bych řekl, že je tomu tak již nyní. Proto jsem zavrhl cestu, která je nyní hojně využívaná – např. Captcha. Zvolil jsem cestu obyčejných znaků a textu generovaných GD knihovnou a zobrazovanou jako PNG.
Systém je založen na textové otázce v národním jazyce a znakových kódech zadávaných též v národním jazyce. Věta i kód jsou zobrazovány náhodně jako text a PNG. To by mělo donutit případného útočníka, aby si celou sekci spam filtru musel převést na bitmapu. Tu následně musí přečíst přes OCR. To by při současných technologiích neměl být pro spamera problém. Další překážka, kterou stavím do cesty, je vkládání náhodných znaků do věty, kterou si útočník musí přečíst. Vypadá to jako překlepy a člověk si musí překlepy odfiltrovat. Robot s tím zřejmě bude mít problém. Robot by musel použít nějaký slovník, který je běžně součástí textových procesorů, a určit se 100 % pravděpodobností, o jaký překlep se jedná. Že to není tak jednoduché se můžete sami přesvědčit, pokud se takový překlep pokusíte ve svém editoru automaticky opravit. Ne vždy se to povede, protože je potřeba překlep vyhodnotit v kontextu věty. A kam tím mířím? Nejedná se konkrétně o češtinu, ale o anglickou verzi tohoto filtru. Vyhodnocování věty umělou inteligencí v angličtině bude vždy trochu napřed vzhledem k rozšířenosti tohoto jazyka. Vyhodnotit a zodpovědět jednoduchou otázku v angličtině by nějaká současná nebo budoucí umělá inteligence mohla. Pokud jí postavíme do cesty ještě překlepy, je to asi maximum, co můžeme udělat, aniž bychom ohrozili použitelnost filtru pro běžného člověka.
Adventní kalendář
Už jste dnes viděli, jak vypadá další odkryté okýnko v našem adventním kalendáři? Každý předvánoční den se na jeho stránce jedna část odkryje. Nenechejte si uniknout pointu a diskutujte o ní v naší diskusi.
To máme tedy větu, která člověku nebo robotu říká, co má udělat. Pokud pokračujeme ve vyhodnocování jako robot a pochopili jsme, co máme udělat, už stačí jen na bitmapě filtru přečíst správná písmena. To bych na místě programátora spamového robota udělal asi jednoduchým grafickým filtrem podle barvy, který by vyloučil falešné znaky. Pak už jen zbývá přes OCR přečíst co zbylo a odeslat výsledný kód přes formulář. Zdá se Vám to jednoduché?
A aby toho nebylo málo, je ve zdrojovém textu výslovně doporučeno pro každou implementaci použít vlastní věty. Jako příklad uvádím věty ze zdrojového textu – 4 varianty pro kód se stejným barevným složením (opisují se v daném případě černé znaky, které jsou doplněny falešnými modrými):
- „Opište znaky vlevo, zobrazené černě“
- „Opište znaky nalevo, které nejsou modré“
- „Opište nejtmavší znaky vlevo“
- „Opište znaky nalevo, které nejsou v barvě oblohy“
Barvy si můžete nadefinovat sami, mělo by jít nadefinovat až devět barev a vždy zobrazit náhodně jen dvě vybrané. Jenže to je tolik kombinací vět ve zdrojovém textu, že se s tím asi nikdo nebude chtít psát. Variant jednotlivých vět je možné vytvořit libovolně mnoho, jako příklad jsou uvedeny čtyři a ve zdrojovém textu a u příkladu jsou nadefinovány jen první dvě varianty. Pro účinnost filtru je důležité zachovat různorodost a nadefinovat si vlastní věty při každé implementaci.
Další ochranou, kromě překlepů a nutnosti vyhodnotit a pochopit větu, je obrana proti skenování databáze vět/otázek z daného serveru, aby útočník nemohl získat jednoduše větší část nebo celou databázi vět. (Tuto databázi by pak pro konkrétní server mohl zpracovat člověk a robota naučit odpovídat na otázku. Otázka by se pak vyhodnocovala podle 95 % podobnosti kvůli definovaným překlepům.) Identifikaci a vyhodnocování podle IP adres jsem zavrhl a vytvořil jsem jednoduchý filtr pro sledování zobrazení stránky s větou a kódem. Jsou definovány časové intervaly a pro každý časový interval je povoleno určité množství zobrazení filtru. Po překročení limitu se zobrazí „Spam filter aktivován” a žádnou větu ani kód neuvidíte. Limity pro každý časový interval si musíte nadefinovat sami podle skutečné návštěvnosti stránky pro vložení diskusního příspěvku. Limity jsou definovány pro 10 sekund, 1 minutu, 10 minut, 1 hodinu, 24 hodin, 1 týden a můžete si zvolit i své vlastní, podle toho jaké časové statistiky máte k dispozici. Tato ochrana by měla hlídat jakékoliv aktivity vybočující z běžného chování návštěvníka. Například i pokus o skenování databáze otázek prostřednictvím sítě botů z náhodných IP adres, pokud toto skenování nebude respektovat hodnoty průměrné návštěvnosti. Následně bych tedy doporučil zlikvidovat veškeré veřejně dostupné statistiky o návštěvnosti, aby spamer neznal průměrnou návštěvnost.
Na diskusích se objevily připomínky přístupnosti takových filtrů pro zrakově postižené. To bych řešil speciálním webovým prohlížečem pro zrakově postižené, který by celou stránku převedl do bitmapy, tu pak přečetl přes OCR a obarvenou stránku převedenou do textu poslal do čtecího zařízení pro zrakově postižené. Tím by se zrakově postiženým zpřístupnila spousta současných webů.
Na závěr ještě detail o zobrazovaných znacích. Vždy mějte na paměti, že zobrazované znaky musejí být jednoznačně čitelné a nezaměnitelné. Ve zdrojových textech jsou úmyslně vynechané některé znaky, u kterých by mohlo dojít k záměně – např. malé o, velké O a nula a některé další. Pro překlepy jsou vkládány jen písmena malé abecedy, aby překlepy dokonale zapadly do věty. Znaková matice čtených kódů je variabilní a můžete jí dát libovolné rozměry a definovat maximální a minimální počty znaků v řádku a počet řádků. To samé platí o celém čtverci: základem jsou 2 čtverce – levý a pravý. Ale můžete si nastavit například matici 2×3, tedy 6 čtverců. Definice otázek by pak vypadala asi jako „vlevo nahoře”, „dole uprostřed“ atd. Systém je tedy plně konfigurovatelný a při dodržení všech doporučení je dostatečně silný a robustní. Možná pro české prostředí nebude ani potřeba používat „překlepy”.
Připravil jsem dvě verze – českou a anglickou. U každé jsou k dispozici zdrojové kódy a funkční příklad. Anglická verze má i anglické komentáře ve zdrojovém textu.
odkazy:
česká verze: kregion.cz/diskusni-forum-komentarovy-spam-filter/
anglická verze: kregion.cz/discussion-forum-commentary-spam-filter/
Aktualizováno:
Původní myšlenka obrany proti skenování otázek z náhodných IP adres byla zcela špatná. Umožňovala opakovaným reloadem zablokovat fórum. Chyba byla opravena a nyní systém vyhodnocuje reloady podle IP adres. Nyní si tedy opakovaným reloadem zablokuje útočník/návštěvník pouze přístup sám pro sebe.