Hvordan jeg ble spamfri på 30min
En simpel men effektiv (i det minste for mindre aktører) måte å begrense og kanskje stoppe kommentarspam på.
Alle som kikker innom cjohansen.no med jevne mellomrom vil ha registrert at jeg har hatt et visst problem med kommentarspam, og at dette problemet har økt i omfang i det siste. Vel, det ser nå ut til at en quickfix jeg gjorde i forrige uke tar unna all spam så langt samtidig som den er usynlig for de aller fleste brukere. Løsningen fungerer uavhengig av publiseringsløsning/bloggesoftware.
Spam i eZ Publish
Alle som blogger med Wordpress spør seg sikkert hvorfor jeg ikke bare installerer Akismet og bruker livet mitt på noe meningsfullt. Vel, jeg digger ikke Wordpress og bruker istedet eZ Publish .
Såvidt meg bekjent finnes det et par innstikk for eZ Publish som håndterer spam, men de to-tre jeg har funnet bruker alle en eller annen form for CAPTCHA. Jeg digger ikke CAPTCHA heller, så jeg holder meg unna.
Double, double toil and trouble
Løsningen må da hjemmebrygges. I utgangspunktet har jeg ikke så mye tid til overs til å lage spam-beskyttelse i bloggemotoren min, så jeg håpet jeg kunne få til noe enkelt. Løsningen ble en variant av en idé min gode kollega Daniel Staver luftet for meg for noen uker siden.
Her er tanken:
Ha ett felt i kommentarskjemaet som må være tomt. Dette er grunnidéen. Hvis vi utbroderer litt kan vi forsøke å ytterligere forvirre robotene:
- Legg til et ekstra felt i kommentarskjemaet
- Sett inn en default-tekst i feltet
- Bruk JavaScript til å fjerne teksten, men sett som fallback inn en label som forklarer brukeren at dersom de ser feltet må teksten i det fjernes
- Ikke ta imot kommentarer hvor dette feltet har en verdi
Resultatet er at brukere med JavaScript ikke opplever forskjell, brukere med JavaScript må blanke ut et felt, og spamboter vil sannsynligvis aldri få gjennom skjemaet. Med mindre de prøver seg med blanke felt. Ok, så idéen kan glatt forbedres til å heller kreve en spesifik verdi.
Aha, sier du, dette begynner å ligne på CAPTCHA alikevel? Tja på en måte. Men dette er bedre for brukeren, fordi de fleste ikke en gang vil se feltet.
Revidert idé
- Legg til et ekstra felt i kommentarfeltet
- For brukere med JavaScript: fyll inn riktig verdi og skjul feltet, for brukere uten, vis feltet sammen med en ledetekst som forklarer hvilken verdi som skal inn, eksempelvis: "Dette feltet beskytter oss mot spam. Vennligst oppgi tallet 3 i dette feltet".
- Godta kun kommentarer som har ønsket verdi i sjekk-feltet
Vel, dette er selvfølgelig helt mulig å gjennomskue for en bot, men at noen oppdaterer algoritmen til boten sin for å hacke et nettsted som undertegnedes er lite sannsynlig. Uansett, skulle noen gjennomskue dette kan du lett sende botene på ville veier:
- Verdien som bes oppgis kan være tilfeldig per sidevisning
- Verdien kan være av rullerende type
- Formuleringen i ledeteksten kan jevnlig oppdateres, eller kontinuerlig roteres
Man skal være forsiktig med å anta at folk skjønner for mye i slike tilfeller. Pass på at verdien du ber om er så lettforståelig så den ikke kan misforstås. De fleste får hjelp av JavaScript uten å merke det, men vi må ikke glemme de stakkarne som ikke har JavaScript tilgjengelig: disse må også få kommentere.
Litt på siden av det hele
Effektiv spam-beskyttelse kan også være å la være å legge ut en artikkel på nettstedet som beskriver nettstedets spam-beskyttelse :) ( Security through obscurity). Siden cjohansen.no er her for å dele, tar jeg den risken. En ivrig sjel gjennomskuer uansett denne teknikken uten store problemer.
Implementering i eZ Publish
Så en måte å gjennomføre dette i eZ Publish på:
- Legg til et heltallsfelt på kommentarklassen
- Sett minimumsverdien til det samme som maksimumsverdien. Dette blir tallet brukere og scriptet må bruke.
- Gjør feltet påkrevet
- Legg inn et script som kjører onload og legger riktig verdi i feltet
I malen må du også legge til feltet:
<div id="comment_protect">
<label for="num">Dette feltet er ment å beskytte cjohansen.no mot spam. Vennligst oppgi tallet 46 i feltet.</label>
<input type="text" class="text" name="powercontent_num_ContentObjectAttribute_data_integer_pcattributeid" id="num" />
</div>
Det viktigste her er id på input-feltet, slik at vi kan hente det ut for å sette riktig verdi. Det er også et poeng (men ikke strengt nødvendig) å ha et element som grupperer label og input siden dette gjør det simplere å skjule begge samtidig.
I tillegg må du ha et JavaScript som kjører på hver side, og når siden har lastet. Det kan se ut som:
window.onload = function() {
var num = document.getElementById('num');
if (num === null) {
return;
}
num.value = '46';
num.parentNode.style.display = 'none';
};
Voila! Simpel spambeskyttelse på en halvtime. For min egen del har jeg gått fra anseelige mengder spam til at ingen spam har sluppet gjennom siden jeg implementerte beskyttelsen. Nå som jeg har beskrevet den blir det spennende å se om ikke spam-en begynner å lekke inn igjen ;)
Kommentarer
Håvard Pedersen
(http://hp.fuzzy76.net/)
9. april, 13:46
Men den eneste grunnen til at slike løsninger fungerer er selvfølgelig nettopp at de er skreddersydde og derfor vanskelige for spammere å automatisere mot. Hvis noen laget en plugin for wordpress for å gjøre det samme hadde det neppe tatt lang tid før spammerne la inn "spesialtilfeller" for plugin'en.
Christian
10. april, 07:39
Som spammer/hacker er man stort sett ute etter å treffe så mange som mulig, og dette går alltid ut over de som sitter på de mest populære løsningene (Wordpress, Windows osv) siden dette gir best effekt for minst mulig arbeid sett fra hackernes ståsted.
HP
(http://hanspetter.no)
12. april, 01:06
Kommentarer er stengt