[Techlog] Weblog spam

Donderdag 1 februari 2007, 15:06 14 reacties

Vooraf: ik ben van plan om vanaf nu zo af en toe een technisch verhaaltje te posten, in plaats van mijn dagelijkse portie bullshit. Ik weet namelijk dat er een heel aantal mensen meeleest dat actief is in de wereld van het WWW, en daarom is het misschien interessant om in te gaan op dingen die daarin een rol spelen. Mocht je echter geheel niet geïnteresseerd zijn, dan kun je deze "Techlogs" gerust overslaan. Morgen weer een "normaal" stukje.

Iedereen die een website heeft waarop bezoekers berichtjes kunnen achterlaten kan ermee te maken krijgen: "form-spam". Deze vorm van spam wordt veroorzaakt door zogenaamde "bots" die over het internet struinen, op zoek naar formulieren om in te vullen. Zodra zo'n bot je formulier gevonden heeft zal deze hem niet alleen invullen ("Casino's, Phentermine, Viagra!") en opsturen, maar vooral ook onthouden voor een volgende keer. Gevolg: een grote berg ongewenste berichten. Zwaar irritant en op het eerste gezicht lijkt er weinig tegen te doen. Toch zijn er oplossingen.

De eerste mogelijkheid is om je gebruikers zich te laten registreren voor ze kunnen reageren. Men moet dan eerst inloggen op je website voor ze een berichtje kunnen achterlaten. Een prima oplossing. Een andere mogelijkheid is om je bezoekers een controlecode te laten overtikken van een afbeelding. Een mooie oplossing, want in tegenstelling tot mensen zijn bots over het algemeen niet in staat om dat te doen. Een soortgelijke oplossing heeft Sanne op haar website. Bij haar moet je een simpel rekensommetje oplossen voordat je bericht doorgelaten kan worden. Goed bedacht, want de eerste bot die kan optellen moet ik nog tegenkomen.

Ondanks het feit dat de bovenstaande oplossingen prima voldoen, schort er naar mijn mening nog iets aan. Het probleem is namelijk dat je bezoeker extra moeite moet doen voordat hij of zij een bericht kan achterlaten. En je bezoeker belasten, dat is wat je nou net niet wil. Om deze reden (en ok, ook omdat het aantal spamberichten op mijn weblog in een paar maanden tijd is toegenomen van twee per week tot twintig per dag) heb ik zelf een nieuwe oplossing bedacht. Voor een ieder die zelf ook last heeft van dit soort spam en op zoek is naar een oplossing zal ik mijn aanpak even uitleggen.

Om dit soort spam tegen te gaan is het belangrijk om te weten hoe een bot te werk gaat. Als hij je formulier gevonden heeft en gaat "reageren" is er iets dat opvalt: hij zal niet alleen een bijna standaard bericht invullen, maar bovendien zal hij ook ALLE velden van je formulier invullen. Aan de ene kant is dit sterk bedacht (de kans dat de boodschap in je database terecht komt zal zo het grootste zijn), maar tegelijkertijd ligt hier ook de zwakte van de bot. Want wat nu als we eens alle opgestuurde formulieren waarbij álle velden zijn ingevuld zouden afkeuren? Juist, dan komt er geen bot meer doorheen. Het enige waar we dan nog voor moeten zorgen is dat je normale bezoekers niet alle velden invullen, maar dat is gelukkig niet zo moeilijk te realiseren.

We beginnen met een simpel formuliertje.

<form method="post" action="post.php">
Naam: <input type="text" name="naam" /><br />
Bericht: <textarea name="bericht"></textarea><br />
<input type="submit" value="Bericht opsturen" />
</form>

Wat we nu gaan doen is een input-veld toevoegen, enkel bedoeld voor de bots, en dus onzichtbaar voor de normale bezoekers.

<div style="display: none;"><input type="text" name="extra" /></div>

Bij het toevoegen van dit veld is het misschien nog wel handig om er een label bij te zetten, om te voorkomen dat mensen bij wie CSS uitstaan (denk aan mobiele apparaten) het veld alsnog invullen. Het geheel ziet er nu zo uit:

<form method="post" action="post.php">
Naam: <input type="text" name="naam" /><br />
Bericht: <textarea name="bericht"></textarea><br />
<input type="submit" value="Bericht opsturen" /><br />
<div style="display: none;">[Antispam] Niet invullen: <input type="text" name="extra" /></div>
</form>

Goed, ons formulier is nu klaar. Het enige wat we nog moeten doen is controleren of het veld door de bezoeker of bot wordt ingevuld, en zo ja het posten onderbreken. Een klein regeltje code bovenaan het "ontvangst bestand" (in dit voorbeeld is dat post.php) moet hier voor zorgen.

<?php if ($_POST[extra] != "") die(); ?>

That's all folks! Bij mij werkt dit perfect en sinds een week ontvang ik geen enkel spambericht meer.

Toch vrees ik dat deze oplossing niet waterdicht zal zijn. Het zal enkel een kwestie van tijd zijn voor de eerste bots opduiken die overweg kunnen met dit soort constructies.

Link naar deze entry
Categorie: Internet, Techlog
Reageren (14 reacties)