Gebruikerslogin

Nu online

Er zijn momenteel 2 gebruikers en 16 gasten online.

Online gebruikers

Enquête

Wat is leuker?
White hat SEO
70%
Black hat SEO
30%
Totaal aantal stemmen: 98

Formulieren anti-spam maken

Erik-Jan Bulthuis

23 december 2006

De laatste tijd worden er steeds meer formulieren gebruikt om spam te versturen. Omdat de spam vanaf jouw mailserver wordt verstuurd, is de kans aanwezig dat jouw server als spamserver op een blacklist komt met als gevolg dat 'gewone' mail vanaf jouw server mogelijk niet meer geaccepteerd wordt. Daarnaast betaal jij voor de traffic en kom je ook nog eens in een negatief blaadje te staan bij de ontvanger van de spam. Allemaal zwaar vervelend dus en tienduizenden webmasters hebben hier al de negatieve gevolgen van gemerkt.

Gerelateerde problemen

Gerelateerd aan het problemen van de spam mailings zijn de spam comments. Als je door middel van een formulier een bezoeker de mogelijkheid geeft te reageren op bijvoorbeeld een blog-item, kan het zijn dat je na een nacht slapen ontwaakt en allerlei verwijzingen naar Viagra en Penis Enlargement op je blog tegenkomt. Dit gebeurt grotendeels via dezelfde technieken als het versturen van spam-mailings, dus we nemen dit mee in dit artikel.

Hoe werkt het?

Het probleem is dat de spammer zogenaamde header-informatie in jouw invoervelden invoert. Dit proces heet email header injection. Een voorbeeld is dat iemand in één van je tekstvelden een regel als "BCC: user1@site.nl,user2@site.nl" toevoegt. Als je script hier niet op berekend is, kan het zijn dat het verstuurde mailtje ook naar de opgegeven emailadressen gaat. Zeker als de spammer het dan ook voor elkaar krijgt om het onderwerp van de email te wijzigen, is het niet moeilijk een niet beveiligd contactformulier te gebruiken als spamformulier.

Hoe lossen we dit probleem op?

Er zijn meerdere manieren op dit probleem op te lossen. We bespreken er een aantal, waarbij we ook de voor- en nadelen noemen.

1. Gebruik een woord (CAPTCHA)

Op veel sites moet je de letters en cijfers van een plaatje overtypen om zo een formulier te kunnen submitten. Dit plaatje is voor gebruikers te lezen, maar een bot kan er vaak niks mee. Alleen als de code goed is overgetypt kan het formulier gesubmit worden. Deze methode heet CAPTCHA, een afkorting van Completely Automated Public Turing test to tell Computers and Humans Apart. Na het submitten van het formulier wordt de ingevoerde code gecontroleerd met de oiginele. Alleen als de twee aan elkaar gelijk zijn, wordt de boel geaccepteerd.

Evaluatie

Hoewel deze methode enigszins goed werkt om te voorkomen dat bots rotzooi gaan plaatsen, voorkom je niet dat gebruikers handmatig troep plaatsen. Ook is het - zeker op een drukbezocht - forum niet gebruikersvriendelijk om steeds een vaak moeilijk leesbare code over te moeten typen. Meer informatie vind je op Captcha.net. Accessible voor blinden en slechtzienden is het ook niet echt. Daarnaast is het ook zo dat - omdat deze methode zo vaak gebruikt wordt - spammers software hebben ontwikkeld waarmee het via een geautomatiseerd proces mogelijk is om de controleterm te 'lezen' uit het plaatje. Vandaar dat sommige plaatjes zo moeilijk te lezen zijn: er wordt van alles aan gedaan om het spammers écht moeilijk te maken.

2. Filteren op bepaalde woorden

Spam maakt typisch gebruik van bepaalde woorden als 'porno', 'viagra' en 'xxx'. Daarnaast worden termen als Content-type en BCC vaak gebruikt voor het versturen van de mailings. Een methode die ik vanwege het relatieve gemak voor de gebruiker nogal eens toepas is dat je de inhoud van de variabelen die gesubmit zijn controleert op deze verboden woorden. Indien er een verboden woord is gevonden, wordt de submit procedure gestaakt. Hieronder een kort voorbeeld van iets als dit in PHP:

<?php
function filterContentType(){

   
$verbodenWoorden = array(    "porno",
                               
"viagra",
                               
"xxx");

    foreach (
$_POST as $key => $value){
        foreach (
$verbodenWoorden as $keyVB => $valueVB){
            if (
stristr($value$valueVB)) {
               
header("HTTP/1.0 403 Forbidden");
                echo 
"Jammer joh, lelijke spammerd!";
                exit;
            }
        }
       
reset($verbodenWoorden);
    }
    return;
}

filterContentType();
?>

Evaluatie

Het voordeel is dat je zeker weet dat je kan bepalen welke woorden niet op je site mogen komen. Nadeel is echter dat als iemand op je forum zegt "Ik heb zo'n hekel aan Viagra-troep", dit waarschijnlijk ook gefilterd zal worden. Een ander nadeel is dat spammers soms wat creatiever zijn: Viagra kun je ook schrijven als V.i.a.g.r.a..

3. Gebruikers van robots onderscheiden

D.m.v. de User Agent kun je in een enkel geval bepalen of degene die iets probeert te plaatsen een gewone browser gebruikt of andere software. In het laatste geval kun je er van uit gaan dat het om spamsoftware gaat, maar helaas is de User Agent string redelijk makkelijk aan te passen zodat dit geen afdoende methode is. Blokkeren op IP is in principe ook mogelijk, maar het betekent dat je eerst moet weten wat het IP-adres van een spammer is. Daarnaast blijft dit een project waar je tot in de eeuwigheid mee bezig kan blijven... In theorie zijn er dus wat mogelijkheden binnen deze oplossing, maar in de praktijk is het niet afdoende.

Evaluatie

De evaluatie is in de uitleg al omschreven.

4. Maximaal aantal submits per periode

Om te voorkomen dat er véél gebruik gemaakt wordt van je formulieren, zou je een cookie kunnen plaatsen die de mogelijkheid ontneemt om gedurende een aantal minuten nóg een keer van het formulier gebruik te maken.

Evaluatie

Het is grappig om te merken dat de methode die o.a. op Sitemasters.be staat veel wordt gebruikt, terwijl het in feite een weinig afdoende methode is. Het probleem is dat je niet voorkomt dat het formulier voor spam wordt gebruikt, maar dat je alleen de kwantiteit wat reduceert. Daarnaast werkt de methode al niet als de gebruiker geen cookie support aan heeft staan. Het is een beperkt lapmiddel, maar verre van een stopmiddel.

Weergave van emailadressen

Een aanverwant probleem is het scrapen van webpagina's om maar zoveel mogelijk emailadressen te verkrijgen. Dit wordt ook wel "email harvesting" genoemd. Een spider doorloopt je hele site en slaat alle emailadressen op in een database, zodat je bij de volgende spamronde 'fijn' mee doet. Hieronder noemen we twee manieren die niet goed werken om scraping te voorkomen, om uiteindelijk tot de enige werkzame oplossing te komen (naast het geheel niet vermelden van je adres uiteraard).

NIET: Direct vermelden

Deze methode is duidelijk. Helaas cirkelt er nog wel eens het fabeltje rond dat een oplossing als <a href="mailto:info@site.nl">emailadres</a> geen probleem is omdat het emailadres niet zichtbaar is. Dit klopt voor de gebruiker (tenzij hij de bron gaat bekijken), maar de bot vind uiteraard het emailadres keurig in de broncode terug. De mailto:-functie kan niet meer veilig gebruikt worden.

NIET: Verbergen met entiteiten o.i.d.

Tegenwoordig zijn de bots dusdanig geavanceerd dat info[at]site[punt]nl prima wordt begrepen. En ook omschrijvingen waarin je de letters van het emailadressen in entiteiten schrijft (&#65; voor een A, &#66; voor een B enz.) worden in de praktijk vaak keurig herkend.

WEL: Een plaatje gebruiken

De beste methode om je emailadres te beschermen voor bots, is om er een plaatje van te maken. Zoals bij de CAPTCHA al uitgelegd, is er tegenwoordig software beschikbaar die plaatjes kan 'lezen' dus wellicht kun je het beste de tekst op het plaatje een schaduw o.i.d. geven, zodat het lezen door software moeilijker gemaakt wordt. Nadeel voor de gebruiker van dit alles is dat copy + paste niet gaat werken: de adressen zullen moeten worden overgetypt als ze nodig zijn.

Yorian
Aantal berichten: 65

Misschien nuttig om even te melden, je kan er natuurlijk ook aan denken om sommige mogelijkheden af te schermen zodat alleen ingelogde gebruikers erbij kunnen.

Het gaat niet voor alle problemen op, maar je zou bijvoorbeeld bij een forum o.i.d. dit kunnen doen zodat alleen mensen die ingelogd zijn het email adres kunnen zien.

alain76
Avatar van alain76
Aantal berichten: 94

Ik heb mijn formulieren ingesteld dat in het tekstveld alles geHTMLENTITIESd wordt (bij deze een nieuw werkwoord).

Daarnaast wil dit ook wel 's helpen:

if ($_SERVER['HTTP_USER_AGENT'] == "") {
echo "Om u en onszelf te beschermen tegen SPAM is het contactformulier alleen beschikbaar als u
uw browser-identificatie aan heeft staan.<br /><br />Als u denkt dat er een fout in het spel
is, kunt u contact met ons opnemen via info @ domein . nl.<br /><br />Onze excuses voor het ongemak.";
exit;
}

DennisWijnberg
Avatar van DennisWijnberg
Aantal berichten: 207

Ik bouw bij dit soort scripts altijd een rekensom in die ik presenteer als: "twee maal acht". De oplossing moet (natuurlijk) als "16" worden uitgevoerd.

Dit werkt in de praktijk ook goed tegen de meeste (ge-automatiseerde) spammers.