Spamfælder

Problemet

Du har lavet en gæstebog på nettet og får nu 10 spamindlæg dagligt.

Dårlige løsninger

Sorter på IP
Spammerne er ikke dumme. De skifter maskiner og adresser hele tiden.
Godkend alle indlæg manuelt
Utilfredsstillende for brugerne. Man vil gerne se sine guldkorn med det samme.
Lad brugeren indtaste en kode, der vises på et billede
Irriterende for brugerne.
Lad et javascript åbne en gæstebogsside eller skrive hemmelige kodeord i formularen
Kræver at brugeren har javascript. Men for nogen er det nok en ok løsning.

God løsning

Indsæt fælder i formularen, så spamindlæg genkendes som spamindlæg.

Formular uden fælde

<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.

Formular med fælde

<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.

Virker det?

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

Det er jo ikke 100%!?

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.

Eksempel: To fælder og to rigtige felter i en form

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.

Sandsynligheder

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.

Level 2

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.

JavaScript

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>

Lidt statistik

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.

[Graf over spamindlæg]

Kommentarer

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.

Jørn Andersen
2006-10-21 02:04

"Lad brugeren indtaste en kode, der vises på et billede"
Ud over, at den er "Irriterende for brugerne.", så er den også *umulig* for blinde.

Jeg blev opmærksom på det i tråden "Web Wiz Forum og login som administrator" (Thu, 19 Oct 2006 22:49:45 +0200) i dk.edb.internet.webdesign.serverside.asp

Mvh. Jørn
jorn@jorna.dk

Toke Eskildsen
2006-10-21 02:27

God pointe. Det kan dog håndteres på forskellig vis. Jeg har både set eksempler på at man kunne også følge et link til en lydfil og at man kunne ringe til et telefonnummer, som alternativer til at læse bogstaverne på billedet.

Det gør det så bare endnu mere besværligt for de blinde og endnu mere besværligt for websnedkeren, der så også bliver nødt til at generere en lydfil til hvert billede. Men jeg kunne forestille mig at det bragte mængden af robotspam ned på praktisk taget nul.

sdfsdf
2006-10-25 14:16

sdfsdf

Toke Eskildsen
2006-10-26 08:44

Spam Der Forbigår Spamfældens Dårlige Filter?

Christian 'CeeJay' Jensen
2006-12-17 04:48

Hvad med at måle på hvor hurtigt formularen blev udfyldt ?

Det tager jo lidt tid for et menneske at udfylde en formular , mens en computer kan gøre det næsten øjeblikkeligt.

Men kunne også smide nogle skjulte radio, checkbox og password elementer ind og se hvordan spamprogrammerne klarede dem. Der kunne være nogle som kun skrev i text felter.

Desuden kunne man indsætte skjulte og helt separate formularer ind andetsteds på siden og blackliste IP'er der skrev i bare et eneste af deres felter .. i kortere tid selvfølgelig - Som du selv skrev så skifter spammere jo IP med mellemrum

Jens Gyldenkærne Clausen
2007-02-01 14:49

Jeg benytter fældeløsningen kombineret med et ip-tjek. Fældeløsningen er sådan set sikker nok til at skelne spam fra rene indlæg (hidtil er samtlige indlæg behandlet korrekt) - men jeg blokerer udvalgte ip-adresser og -områder for at undgå at fylde kommentartabellen op med spamindlæg.

Med mellemrum tjekker jeg ip-adresser på de registrerede spamindlæg, og hvis der er nogle der ofte anvendes bliver de blokeret fremover. Det sikrer også at den person der modtager mailnotits om formodede spamindlæg ikke bliver overbelastet. Selv om spammere selvfølgelig kan skifte ip, fanger man alligevel en del ved at blokere alle adresser i et område. Aktuelt har jeg fx blokeret 195.225.177.* der stammer fra en udbyder i Ukraine.

mvh Jens

Rune Jensen
2007-10-04 00:42

Følgende kan oplyses om min egen side:

1. Det tog ca. 1-1½ måned fra siden med kommentar-felter var oppe til den første spam-bot fandt vej. Så det går hurtigt. Jeg har ingen Google rank, men er indekseret på de forskellige søgemaskiner, dog meget langt nede, og har links fra andre sider, samt nyhedsgrupper til min forside

2. Botten gik efter links siden - hvor der er mulighed for at indtaste kommentarer. Dvs. filnavne er - formodentlig - vigtige (men vidst kendt viden). Ingen andre sider var infected, selvom den ville kunne følge dem via linkssiden og også dér smide kommentarer

3. Den bruger ID og/eller name attributter. Jeg har en id og name sat til *email*, som i virkeligheden er tekstfelt for brugerens hjemmeside (scriptet, jeg har, er redesignet, så der mangler stadig opdatering på sådan noget), og deri skrev den tre emailadresser. Så deri har du altså ret, man kan forvirre i hvert fald nogle spambotter ved at angive forkerte eller misvisende name

4. Den indsætter URLs både som URL i brackets kendt fra f.eks. forums, samt anchor tagget fra alm. html. Måske ikke alle botter gør det, men denne ville gerne være sikker.

Hvordan den fandt vej, er lidt interessant. Jeg har haft lidt søgninger på div. søgemaskiner indenfor den senere tid, som jeg synes var lidt mystiske - de var meget præcise søgestrenge, hvilket jeg synes er lidt mistænkeligt. Men om det er det, og hvordan det skal kædes sammen, er jeg ikke klar over. Og så i dag, hvor jeg fik besøg af botten, har jeg haft besynderligt mange udenlandske ´gæster´.

Jeg har nu lavet en foreløbig simpel spam-fælde, hvor man skal skrive et tal med cifre som spambotfælde (altså: bevis, du er menneske). Tallet er ikke tilfældigt (foreløbigt), da jeg vil se, om den kan regne det ud. Men ellers overvejer jeg en lign. løsning som ovenstående baseret på dato. Idéen er, at man ikke skal bruge et hidden felt til at overføre værdien i spamprotection feltet. Problemet er selvfølgelig skiftet imellem to datoer.

MVH
Rune

ERADDYNILYDAY
2007-10-06 05:04

May be im a mourner may be i deserve to do something else.
Need to feel the sense.

Jes Lund
2008-03-19 11:45

Er spambot fælderne aktiveret her?

Jeg er en være spambot :)

Godt initiativ - mere af den slags!

God påske!

Erik Ginnerskov
2008-04-26 17:47

Jeg indførte for et par år siden et hidden felt i formularen til min gæstebog og i min kontaktformular.

Samtidig valgte jeg at omdøbe siderne, så de ikke alene på deres filnavne tiltrak botter.

Både bin gæstebog og min kontaktformular var før disse tiltag slemt plaget af botter, men siden har jeg været forskånet for det uvæsen.

Michael
2009-04-14 14:50

Hej alle

Interessant læsning

Michael
2009-04-14 14:52

Hvilket script bruger du til denne her kontakt-formular?

Jeg har prøvet at indtaste noget der godt kunne være spam og dit script sendte mig en besked om at det var spam.

Toke Eskildsen
2009-04-15 22:24

Hmm... Der filtreres på "a href", men derudover er det blot checks for om der er skrevet i de felter der skal skrives i og om der ikke er skrevet i de felter der ikke skal skrives i.

Faktisk er mit script ikke helt så filtrerende, som det kunne være. Men der er ikke sluppet noget formularspam igennem overhovedet i meget lang tid, så jeg har ikke gidet pudse på det. Spambots forsøger stadig, men i langt mindre grad end tidligere: I den seneste måneds tid har der kun været et par hundrede forsøg.

Annette Frederiksen
2009-10-17 21:47

Hej Toke
Jeg er absolut ikke IT-nørd og fatter ikke ret meget af al det der HTLM øh kode noget.
Jeg har lavet en hjemmeside i Frontpage (ønsker ikke at skifte, har dog købt den nye SharePoint Designer).
Min gæstebog bliver spamet helt vildt og FP kan ikke selv sætte filtre op - kan du måske hjælpe mig.

Toke Eskildsen
2009-10-17 22:23

Annette: Jeg hjælper gerne med korte svar på konkrete spørgsmål, men jeg har ærlig talt ikke overskud til at vejlede gennem en hel implementering. Beklager.

Massad
2012-08-18 10:14

The great work. And you agree to let me catch you feed to keep up with the received the mail. Thanks one million please keep the good work

dghfgh
2015-04-13 15:10

dhfhfgh

Toke Eskildsen
darkwing@daimi.au.dk
12. maj 2009