Du har lavet en gæstebog på nettet og får nu 10 spamindlæg dagligt.
Indsæt fælder i formularen, så spamindlæg genkendes som spamindlæg.
<form action="/cgi-bin/guestbook.pl" method="post"> ... <label>Navn</label> <input name="author" value="" size="40" /> <label>Kommentar</label> <textarea name="message" cols="60" rows="8"></textarea> <input type="submit" value="Send indlæg" /> </form> ...
En klassisk formular, hvor inputfelterne er navngivet fornuftigt. Guf for en spamrobot.
<form action="/cgi-bin/gronk.pl" method="post"> ... <label>Navn</label> <input name="pongo" value="" size="40" /> ... <div style="visibility: hidden"> <label>Undlad at skrive i dette felt</label> <input name="author" value="" size="40" /> <label>Undlad også at skrive i dette felt</label> <textarea name="message" value="" cols="40" rows="4"></textarea> </div> ... <label>Kommentar</label> <textarea name="flimflam" cols="60" rows="8"></textarea> <input type="submit" value="Send indlæg" /> ... </form>
Navnene på felterne er ændret, så author og message er blevet til pongo og flimflam, bare for at forvirre spambots lidt. Det samme gælder navnet på CGI-scriptet med gæstebogen. Mere vigtigt er det med de to nye felter, der har overtaget de gamle navne author og message.
De to nye felter er indkapslet i en div
, der gør dem usynlige. Hvis brugerens browser alligevel skulle vise dem, er det skrevet tydeligt at han altså ikke må fylde noget i felterne. Spambots er ligeglade med om noget er usynligt eller ej. De hælder bare i.
Når serveren modtager input fra gæstebogen, skal den sortere de indlæg fra, hvor author eller message er angivet. Det er nu nok en god ide at gemme dem et eller andet sted, hvis der skulle ske fejl.
Jeg fik ca. 400 spamindlæg om måneden på mine sider. Ca. 1% blev ikke fanget af ovenstående. Der var ingen indlæg, der fejlagtigt er blevet klassificeret som spam (kontrolleret ved stikprøver og ved at skimme størrelserne af indlæggene).
Nej. Nogen spambots fylder åbenbart kun i nogen af input
-felterne. Det er heldigvis de færreste, men lad os se på hvad der sker, hvis flere af dem begynder på det.
Der er 4 felter i alt. Vi antager at robotten fylder mindst ét felt og at den fylder tilfældigt. Det giver 2*2*2*2-1 =15 kombinationsmuligheder. Der er tre kombinationer, der er lovlige, nemlig ét af de to rigtige felter eller begge de rigtige felter. Der er altså 3/15 ~= 20% chance for at indlægget slipper igennem.
Husk på at de fleste spambots fylder alle felter, så ovenstående er worst-case.
Med afsæt i ovenstående kan der laves en tabel med sandsynlighederne for at et spamindlæg slipper igennem.
Hvis vi antager at der skal udfyldes mindst ét rigtigt felt, men at man ikke behøver at udfylde dem alle, har vi sandsynlighederne for at spambottens indlæg slipper igennem:
Rigtige | |||||
---|---|---|---|---|---|
Fælder | 1 | 2 | 3 | 4 | |
0 | 100.0% | 100.0% | 100.0% | 100.0% | |
1 | 33.3% | 42.9% | 46.7% | 48.4% | |
2 | 14.3% | 20.00% | 22.6% | 23.8% | |
3 | 6.7% | 9.7% | 11.1% | 11.8% | |
4 | 3.2% | 4.8% | 5.5% | 5.9% | |
5 | 1.6% | 2.4% | 2.7% | 2.9% |
Hvis vi i stedet siger at alle de rigtige felter skal udfyldes, har vi sandsynlighederne:
Rigtige | |||||
---|---|---|---|---|---|
Fælder | 1 | 2 | 3 | 4 | |
0 | 100.00% | 33.3% | 14.3% | 6.7% | |
1 | 33.3% | 14.3% | 6.7% | 3.2% | |
2 | 14.3% | 6.7% | 3.2% | 1.6% | |
3 | 6.7% | 3.2% | 1.6% | 0.8% | |
4 | 3.2% | 1.6% | 0.8% | 0.4% | |
5 | 1.6% | 0.8% | 0.4% | 0.2% |
Der sker gode ting, når vi når op på 4-5 fælder. Givet at fælder ikke fylder meget, er der oplagt at strø dem med løs hånd henover sine forms.
Ovenstående virker ikke hvis en spammer manuelt går ind og vælger de felter, der skal udfyldes. Dette kunne håndteres ved at generere unikke forms, med tilfældige fælder, ved hver sidevisning.
Ryan Kristensen, skribent i nyhedsgruppen dk.edb.internet.webdesign, foreslog en god JavaScript-løsning: Et script sættes til at skrive et kodeord i et input-felt. Dertil tilføjes en noscript-element, hvori brugeren bedes skrive kodeordet i input-feltet.
Det fine ved denne løsning er at brugere med JavaScript ikke behøver gøre noget ekstra, men at det alligevel kan lade sig gøre at skrive kommentarer, hvis man ikke har JavaScript i browseren.
<noscript> <label for="moretraps">Skriv venligst flum i dette felt:</label> </noscript> <input type="text" id="moretraps" name="writehere" /> <script type="text/javascript"><!-- var elem = document.getElementById('moretraps'); elem.style.display = 'none'; elem.value = 'flum'; // --></script>
Nedenstående graf er over ca. 23.000 spam-indlæg. Der er lidt over 70 indlæg om dagen. De stammer næsten udelukkende fra 2 formularer på ekot.dk.
Niveau 1 (simple fælder) kom på i februar, mens JavaScript-løsningen kom på omkring april.
Det interessante her er at der stadig har været spam, der slap igennem, selvom JavaScript-løsningen var sat til. Jeg gætter på at det har været en spam-bot, der har anvendt en webbrowser-komponent, så den har foretaget fuld rendering af websiderne, incl. fortolkning af JavaScript.
En anden interessant ting er at mængden af spam faldt betragteligt efter et peak i september 2006 og at mængden af ikke-fanget spam faldt til 0 fra den 30. september og frem (jeg skriver dette den 11. oktober). Jeg tolker at et spam-netværk er gået lidt for meget amok og er blevet lukket ned.
Du skal være velkommen til at komme med en kommentar eller en rettelse til ovenstående. Disse vil blive vist her på siden. Og nej, at du kan sætte en bot til at spamme netop denne side, beviser ikke at løsningen er dårlig.
Hvis du vil eksperimentere med spamfiltreringen, så benyt venligst testsiden.
Toke Eskildsen
darkwing@daimi.au.dk
12. maj 2009