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.
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.
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.
Er zijn meerdere manieren op dit probleem op te lossen. We bespreken er een aantal, waarbij we ook de voor- en nadelen noemen.
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.
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.
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();
?>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..
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.
De evaluatie is in de uitleg al omschreven.
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.
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.
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).
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.
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 (A voor een A, B voor een B enz.) worden in de praktijk vaak keurig herkend.
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.
24 december, 2006 - 15:01 | login of registreer om reactie te posten | |
|---|---|
| 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. |
6 januari, 2007 - 11:09 | login of registreer om reactie te posten | |
|---|---|
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'] == "") { |
16 april, 2007 - 14:05 | login of registreer om reactie te posten | |
|---|---|
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. |