Förhindra skräppost med enkelt JavaScript
Som jag skrev i förra inlägget, så har det börjat rasa in skräppost på bloggen sedan ett par månader tillbaka och även om det i WordPress är väldigt enkelt att radera skräpet genom ett par klick, så har jag inget emot att slippa detta helt och hållet.
Det blir allt vanligare med CAPTCHA-skydd av olika slag för att förhindra skräppost och det går ut på att visa ett eller flera ord som knappt går att tyda. Rent tekniskt utgörs dessa ord av en eller flera bilder med förvrängda bokstäver, vilka är relativt lätta för oss människor att tyda, men det är svårare att skriva program som kan tyda dem.
Istället för att installera ett CAPTCHA-skydd, så valde jag att skriva ett väldigt enkelt JavaScript för att verifiera innehållet i en textbox som jag lade till i kommentarsformuläret. Anledningen till att jag inte installerade ett färdigt tillägg beror på att jag vill försöka ta reda på hur effektiva dessa spambotar är och dels för att jag undviker att installera tillägg i onödan.
Ett välskrivet spambotprogram kringgår det här skyddet väldigt lätt eftersom det består av ett fullt synligt JavaScript (synligt i källkoden) och därmed finns svaret på frågan att läsa i den koden. Ett vettigt skrivet spambotprogram hittar koden i formuläret som kräver verifiering (
<form action="https://www.spix.nu/wp-comments-post.php" method="post" id="commentform" onSubmit="return Verify()">
) innan formuläret skickas och där står även funktionen som ska anropas.
Ett program letar efter ordet ”onSubmit”. Eftersom ordet återfinns i raden som innehåller ”form action” etc, så vet programmet att formuläret kräver någon slags verifiering.
Programmet fortsätter läsa av det som står efter ”onSubmit” och hittar namnet på funktionen som ska anropas.
Därefter letar den upp funktionen/texten ”Verify” i sidans källkod och där letar den efter olika if-satser.
Min kod för att verifiera att rätt värde matats in ser ut som följer:
if(document.forms['commentform']['sSiffra'].value == "13")
Programmet letar efter ordet ”.value” och det som följer därefter och det troliga är att det som följer efter ”==” är värdet som ska anges i textfältet.
Det går förstås att skriva koden annorlunda och vrida och vända på if-satser och liknande, men som programmerare, så vet man vad man ska leta efter och skriver kod för alla tänkbara scenarier.
Att skriva sådana här skydd med JavaScript är med andra ord inte speciellt smart om man verkligen vill skydda sig mot spambotar och det är därför vanliga CAPTCHA-skydd verifieras först efter att sidan laddats om. Man verifierar alltså inte något på klientsidan utan formulärdatan skickas till servern där kod exekveras.
PHP-kod och annan kod som exekveras på servern syns inte på klientsidan, vilket innebär att du inte kan se koden genom att välja ”Vissa källa”, eller vad det nu heter i din webbläsare. Det innebär även att ett spambotprogram inte kan hitta koden och det är själva poängen.
Nackdelen med att skicka formuläret till servern är att servern måste exekvera kod och därmed göra av med resurser, vilket man slipper med JavaScript som istället exekveras hos klienten.
Redan några minuter efter att jag lagt upp mitt lilla JavaScript för att hindra spambotar insåg jag att det inte fungerade. Programmet/programmen visade sig vara precis så välskrivna som jag var rädd för och mitt JavaScriptskydd utgjorde sålunda inget hinder. Jag hann med andra ord inte ens skriva klart det här inlägget förrän det hade ploppat in omkring fem skräpkommentarer, samtliga uppfångade av Akismet.
Nu har jag lagt till verifieringen på sidan som behandlar formuläret och hoppas att det ska fungera bättre.
Du kan alltså inte längre hitta JavaScriptkoden som jag skrev om här ovan i källkoden för den här sidan eftersom jag under skrivandet av det här inlägget insåg att det inte fungerade och därför skrev om koden, men jag hoppas du förstår principen ändå.
Nu väntar jag på att se om spambotprogrammen förstår vad ”tretton” betyder, vilket inte alls är en omöjlighet och det hela blir lättare av att jag i princip talar om för programmen vad det är jag är ute efter.
Eftersom jag omgärdat ordet tretton med citationstecken, så kan programmen lista ut att det ordet har betydelse och programmeraren har antagligen skrivit ihop en rejäl ordlista med betydelsen för varje ord/fråga/fras. Jag räknar dock med att denna lista ska bestå av främst engelska ord och inte svenska.
Visar det sig att programmen faktiskt ”förstår” vad tretton betyder, så får jag ändra till något svårare, men jag vill inte börja med något för svårt eftersom jag samtidigt vill ta reda på hur mycket tid programmeraren lagt ner på sitt program.
Att programmet ”förstår” vad tretton betyder innebär endast att ordet ”tretton” återfinns i programmets ordlista där programmeraren angett att ”tretton” betyder eller motsvarar ”13”. Inget program ”förstår” något utan det är alltid upp till programmeraren att skriva kod som utgör ”förståelsen”.
Nu väntar jag spänt på att se om det dyker upp någon skräpkommentar eller inte i Akismet’s nät.
När jag publicerar det här inlägget har det gått dryga halvtimmen sedan jag tog bort mitt JavaScriptskydd och hittills har det inte dykt upp någon skräpkommentar, så chansen är stor att programmen inte förstår betydelsen av ”tretton”.
Uppdatering klockan 10:55
Bestämde mig för att lägga till en verifiering av att textfältet med hjälp av JavaScript, men endast en kontroll av huruvida fältet är ifyllt eller ej.
Spambotarna förstår ju att ett värde måste anges, men i det här fallet kommer programmet inte förstå att det är en verifiering av själva värdet som egentligen efterfrågas utan tror att det enbart handlar om ett textfält som måste fyllas i, ungefär som fälten för namn och e-postadress och fyller därför i fältet med något standardvärde.
För att förstå att det är värdet som egentligen ska verifieras, så måste programmet ”förstå” innebörden av uppmaningen att fylla i tretton i sifferform och det är föga sannolikt att någon programmerare tänkt så långt när han skrev sina funktioner.
Fördelen med att lägga till verifieringen är att en riktig besökare uppmärksammas på att fältet måste fyllas i, istället för att få detta kastat i ansiktet på nästföljande sida, med risk för att formuläret är tomt när han eller hon backar tillbaka, så JavaScript-verifieringen är ändå något positivt, även om det inte förhindrar skräpkommentarer.
Men vi svensktalande förstår betydelsen och kan därför posta kommentarer 🙂
Det här är bara en testkommentar för att verifiera att kommentarsfunktionen fortfarande fungerar…