Spam-botai yra protingos būtybės. Pakankamai protingos, kad galėtų panaudoti OCR bet kokiam captcha atpažinimui. Yep, phpnuke bei phpbb forumuose jau senokai atsiranda spamo įrašų. Taip pat kaip ir blogas.lt. Bet dalykas tas, kad aš čia nerašysiu apie paruoštų sistemų formų apsaugas (tuos pačius phpnuke, phpbb, wordpress, etc.). Tuom turėtų pasirūpinti sistemų programuotojai. Aišku, jeigu jie yra kompetetingi. Aš norėčiau pakalbėti apie savų kuriamų projektų apsaugą nuo spamo. Anksčiau ar vėliau tikrai ateis tas laikas, kai į tavo kurtą puslapį atropos spam botas, ras formą jame ir pradės tau siūlyti belenkokį nereikalingą šlamštą. Nelabai apkrauna serverį, labai eikvoja laika ir dar labiau erzina. Sprendimas, iš tiesų, yra be galo paprastas.
Aš taip primečiau, kad norint apsisaugoti nuo spamo ir belenkokio pikto internetinio briedo, kuris siunčiamas per formas, užtektų patikrinti ar “lankytojas” naršo per pilnavertę naršyklę ir net nereikėtų tikrinti ar vartotojas yra iš tiesų žmogus. Kaip jau minėjau – captcha yra lengvai apeinamas, o spręsti matematines lygtis ir atsakinėti į klausimus – užknisa. Ir aš tikrai nekalbu apie User-Agent http antraštę. Ją juokingai lengva sufabrikuoti.
Spam-botai yra kvailos būtybės. Pakankamai kvailos, kad jas būtų galima apgauti gabaliuku gudraus JavaScript kodo. Aišku, čia prabyla mano kompetencijos trūkumas: nežinau ant kiek spam-botai yra kvaili ir nesupranta JS kodo. Manau, kad visi spam:botai yra parašyti Windows operacinei sistemai (nes Linux ir Mac OS X vartotojų segmentas yra per siauras), tad jeigu programos ir naudoja naršyklę, tai tai yra IE. Dabar keletas scenarijų apsaugoms (warning: programmer slang ahead), kurie yra įgyvendinami naudojant paprastus JS event-handlerius (tingėjau ieškoti lietuviško atitikmens):
- Raktas –
onsubmit(arbaonload) event-handleriui pakišama funkcija, kuri sugeneruoja paslėptą formos elementą (tarkim not_spam_bot=yes). Serverio pusėje užtenka patikrinti ar forma atėjo kartu su šiuo elementu. Jeigu ne – nepilnavertė naršyklė arba spam-botas! - Siuntimo adresas – event-handleriams priskiriama funkcija, kuri pakeičia formos siuntimo adresą į teisingą (tuo tarpu pirmąjį galima būtų sukurti tokį, kuris 4fun ™ registruotų spamintus formų siuntimus)
- Elementų vardai – vėl gi – tiems patiems event-handleriams pakišama funkcija, kuri sutvarko formos elementų vardus.
Aišku, įmanomos įvairios šių (ir ne tik) scenarijų kombinacijos. Ir kad dar šiek tiek apsunkinti visą reikalą spam-botams (kurie, galbūt, tiesiog durnai interpretuoja JS kodą) visą JS ant formų reiktų užkabinti nemaišant struktūros ir logikos.
Neišradau rato, bet gal atsiras penas tavo mintims, kuriomis pasidalinsi komentaruose.
Aš šiek tiek kitaip darau. Sugeneruoju atsitiktinį raktą sesijoje ir jį rodau formoje – ale captcha. Tuo pačiu su JS padarau AJAX request’ą, paprašau to rakto iš sesijos ir paslėpiu nuo vartojo, kuris turi JS įjungęs. Jei vartotojas neturės JS jam reikės įvesti raktą ir tiek.
Spam botai tuo tarpu turi palaikyti ir sesijas ir javascript’ą, jei nori spaminti be vargo. Jei nepalaikys sesijų (cookie’ių) negalės komentuoti išvis, jei nepalaikys js reikės captcha laužti. Kol kas negavau nė vieno spam’inio komentaro.
Deja nuo idiotų, tai neapsaugo :)
O jei JS nėra, tai vartotojas rūko :)
O dar yra paprastesnis variantas: su CSS užslėpti lauką, kurio pavadinimas yra tarkim “description1″. Su sąlyga, kad spam botas nežino, kurių laukų reikia, o kurių ne, jis bijodamas to, kad neužpildys kokio privalomo lauko, suvaro ką nors visur.
O čia imi ir patikrini, jeigu laukas, kurio vartotojas net neturėjo matyti užpildytas – spiri lauk :)
Kol kas irgi 0 spamo šiuo būdu ;)
Daliau – truputį daug duomenų stumdymo, bet jeigu veikia – tikrai cool (rašydamas apie sesijas nepagalvojau kažkaip).
Artūrai – irgi geras variantas .) Dėl vartotojo, kuris naršo su išjungti JS – neteko praktikoje tokio sutikti. Tikiuosi, kad tokių ir nėra, nes nematau kokiose situacijose reiktų atjungti JS.
Įdomu, kiek spam-botų dar nemoka JavaScript? Kas jiems trukdo naudoti “Mozilla Engine” botų kurimui? :)
Artūro būdas tai totaliai gerulis :)
Tokį variantą kaip Artūro irgi jau kurį laiką naudoju, tai kol kas veikia 100% – nors iš pradžių sugalvojus atrodė neįtikėtina, kad taip efektyvu :-)
Aš pats naudoju tokį pat būdą, kaip Artūras. Su CSS paslėpiu laukelį pavadinimu “Name”, “URL” ar “Email”. Nulis spam’o. Spambotai YPAČ mėgsta laukelį “URL” :)
[...] pas Eimantą komentaruose radau genialiai paprastą sprendimą, kaip apsaugoti web formas nuo spamo: su CSS [...]