Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

Spam via contactformulier

C0mpN3rd
16 antwoorden
  • Hoe kan ik mijn contactformulieren beschermen tegen spam?
    Ik dacht dat ik dat redelijk onder controle had, maar de laatste tijd moet ik de meest omslachtige middelen aanwenden om er iets tegen te doen. Ik word er wanhopig van.

    Voorheen checkte ik in mijn scripts via $_SERVER['HTTP_REFERER'] of de data wel rechtstreeks van de website afkomstig was en later valideerde ik de binnenkomende $_POST velden op verdachte inhoud (alleen inhoud die verwacht wordt en geen termen als b.v. BCC:, CC: of TO: er in)
    En tot voor kort werkte dat heel redelijk.
    Maar de laatste tijd gaat men er gewoon doorheen alsof er geen enkele controle bestaat.

    Momenteel doe ik het mbv PHP sessies. Ik open een PHP sessie op elke andere pagina, maar niet op de contactpagina zelf. En het script checked dan of er een sessie open staat. (M.a.w. Om het contactformulier in te vullen moet je eerst minimaal één andere pagina hebben bezocht). Maar dat is zo omslachtig implementeren dat het bijna onzin is. Bovendien is het erg gebruiksonvriendelijk.

    Iemand tips?
  • weet niet in hoeverre je hier wat mee kunt, maar wil deze ervaring delen…
    op een van 'mijn' sites ook steeds spam via contactformulier. was 'netjes' afkomstig van de server van de site.
    ten einde raad de naam van het formulier gewijzigd, en sindsdien geen spam meer gehad. ik vermoed dat een of ander soort robotje, gevoerd met de formuliernaam, de boosdoener was.
  • In welk opzicht heb je de naam veranderd? De naam van de pagina met het formulier (contact.htm) of het name attribuut in <form>?
  • Je kunt een referrer ook spoofen, dus dat is geen geweldige beveiliging. Een goede captcha werkt wel redelijk, maar is lastig voor de gebruiker. Ik heb zelf een routine ingebouwd, die het ip van de zender checkt op spamblocklists. Werkt bij mij erg goed, ik krijg maar heel zelden spam. Mijn script is in perl, maar er vast wel iets vergelijkbaars in php te vinden.
  • Die rederrer check behoort inderdaad al een poos tot het verleden (Het was slechts een illustratie hoe ik het in het verleden oploste)
    Maar waar vind ik zo'n lijst met IP's? Want ik heb de indruk dat dit van een botnet afkomstig is, de IP's zijn elke keer totaal anders.
  • Ik kom meer uit het forum wereldje, maar daar wordt bijvoorbeeld Stop Forum Spam, Spamhaus, BotScout, Akismet en Project Honey Pot gebruikt.

    Zelf ben ik daar dan weer niet zo'n voorstander van, aangezien je met blacklists het risico hebt van valse positieven. Een goede CAPTCHA kan redelijk eenvoudig zijn zolang je maar uniek bent. Overhoop gegooide letters zijn dat niet; die zijn voor bots tegenwoordig gemakkelijker te lezen dan voor mensen en vallen dus buiten de definitie van CAPTHCA. ;)

    Een simpele vraag als "Neem de blauwe letters uit mijn logo over" (antw. "orking") zal het gros van de spambots stoppen omdat ze dàt nu net niet in hun routine hebben. Een dergelijke Vraag&Antwoord combinatie wordt op legio forums gebruikt en is erg effectief (het is zelfs de meest aanbevolen techniek voor de meest gebruikte forumsoftware en toch nog effectief).

    Een andere leuke aanpak is sortables captcha. Die is gemaakt voor phpBB, maar kun je wellicht als inspiratie gebruiken voor jouw site.
  • @gooly: >In welk opzicht heb je de naam veranderd?<
    simpel een teken voor, in of achter de formuliernaam
  • Ik heb zelf al eens gedacht over het randomizen van veldnamen. Dus dat je een willekeurige tekenreeks gebruikt, bijvoorbeeld "skldfjsdljkf" in plaats van "naam", en dat ook wisselen bij elk gebruik van het formulier. Moet je dan wel koppelen aan een cookie of sessie. Heb het nog niet gedaan en weet niet of het werkt, maar je zou het eens kunnen proberen.

    Die ip blocklists download je overigens niet. Je stuurt een ip naar een of meer van die services en je krijgt een antwoord terug of ze al dan niet op zo'n lijst voorkomen. Ik maak sowieso een log aan van alle verstuurde mail, zodat ik kan checken op false positives. Net nog even gekenen, maar zie er zo geen. Wel de wereld aan tegengehouden spam over paxil, prozac, kredieten, erfenissen, loterijen en wat niet al.
  • Een andere techniek waar ik eens over gelezen heb (heb het nooit zelf geprobeerd) is het toevoegen van een tekstveld en deze met CSS onzichtbaar maken. Een mens ziet deze niet en zal deze niet invullen, een spambot wel.
  • @Supersnail, Goed idee. Op zich een beetje tegen mijn scripters gevoel in, maar erg effectief lijkt me. Niemand heeft er last van.
    @Gerben, Ik denk dat het niet gaat werken. Ik heb onlangs een extra veld toegevoegd, met een hidden input, met een random veldnaam en random waarde, waarvan ik de waarde middels een sessie onthield.
    [code:1:a33aaf0af4]
    <input type="hidden" name="5fKJh7dFg" value="6tfLK3Bhf96JbngR5" />
    [/code:1:a33aaf0af4]
    En dat kwam keurig netjes zo binnen.
    @Ger: Eigenlijk wil ik de eindgebruiker niet lastigvallen met extra handelingen, en capcha's vind ik eerlijk gezegd het meest verschrikkelijke dat ooit is uitgevonden. Ik erger me dood aan die dingen. Maar een extra veld invullen lijkt me ook redelijk safe.

    Wat me dan weer niet los laat is: Hoe doen ze dat? Ik neem aan dat zo'n spambericht via een contactformulier niet op zichzelf staat. Want de ontvanger pleurt het meteen weg. Dus ik neem aan dat dit script gebruikt wordt om massaal spammails te versturen naar anderen.
    Ik ga eens een extra functie in het send script bouwen om te loggen wat hij op het laatste moment nou eigenlijk verzend. Dus pal voor het verzenden nog even de mailheader in een logfile opslaan, ook al denk ik precies te weten wat er in staat.
    Misschien brengt dat wat meer duidelijkheid.
  • PS. Overigens ben ik momenteel bezig met een nieuw experiment, waarbij ik de tijd van het formulier parsen en het terug ontvangen van data ga bijhouden in een sessie. Als dat dan minder is dan b.v. 5 seconden, dat het dan niet klopt omdat iemand een bepaalde tijd nodig heeft om het formulier in te vullen.
  • [quote:deeebe035d="Gooly"]@Ger: Eigenlijk wil ik de eindgebruiker niet lastigvallen met extra handelingen, en capcha's vind ik eerlijk gezegd het meest verschrikkelijke dat ooit is uitgevonden. Ik erger me dood aan die dingen. Maar een extra veld invullen lijkt me ook redelijk safe.[/quote:deeebe035d]Een CAPTCHA moet je iets breder zien hè. De meest gebruikte zijn de overhoop gegooide letters en die zijn inderdaad gruwelijk irritant. Maar uiteindelijk draait het gewoon om het kunnen herkennen van een bot ten opzichte van wat een mens zou doen.

    Een mens zou inderdaad een met CSS verborgen veld niet invullen bijvoorbeeld zoals SuperSnail aangeeft, dus dat is een optie. Al is dat inmiddels ook een bekende tactiek dus wellicht dat de bot in kwestie ook even de CSS eigenschappen van dat veld checkt. Maar misschien kun je iets met jQuery waarmee je de labels van een aantal velden omwisselt ten opzichte van de HTML structuur? Dus bijvoorbeeld:

    [code:1:deeebe035d]<form … >
    <label for="post_1" class="name">Naam</label> <input type="text" name="post_1" />
    <label for="post_2" class="email">E-mail</label> <input type="text" name="post_2" />
    </form>[/code:1:deeebe035d]
    Als je nu met jQuery zorgt dat je de labels omwisselt (dus label email boven en name onder) zal een mens in het eerste veld een emailadres invullen en een naam in het tweede veld. De bots die ik ken doen niet aan jQuery en zullen dus afgaan op wat er in het label staat om zo goed mogelijk het formulier in te vullen. En dus geven ze in het eerste veld een naam en in het tweede veld een email in. Indien dat tweede veld dan valideert als een email, weet je dat je met een bot te maken hebt en kun je het bericht als niet-verzonden beschouwen.

    Ik zeg niet dat het waterdicht is (schud het net uit mijn mouw) maar het kan al wel een indicatie geven of je met een bot of een mens te maken hebt.

    Verder zou ik zeggen: kijk eens naar Akismet en Project Honeypot. zo'n 95% van de bots zijn wel bekend en met een dergelijke check kun je dus ook al een hoop afvangen. Je loopt dan alleen het risico op valse positieven.

    Derde optie: combineer een aantal technieken. Indien een bericht door bijv. Akismet als spam wordt aangemerkt én het tweede veld valideert als email, is de kans minder dan 1 promille dat je met een goedwillend persoon te maken hebt.

    [quote:deeebe035d="Gooly"]Wat me dan weer niet los laat is: Hoe doen ze dat? Ik neem aan dat zo'n spambericht via een contactformulier niet op zichzelf staat. Want de ontvanger pleurt het meteen weg. Dus ik neem aan dat dit script gebruikt wordt om massaal spammails te versturen naar anderen.[/quote:deeebe035d]Wet van de grote getallen. Als ze 1 spamformulier per pak-m-beet 10 seconden kunnen invullen, is dat dus zo'n 3 miljoen per jaar. Reken op 1 promille respons, dan zit je dus nog aan drieduizend hits. En dat is per bot die je de wereld instuurt. Zulke bots worden simpelweg gekocht (XRumer is momenteel berucht in het forumwereldje) en door weet-ik-hoeveel spammers gebruikt.

    [quote:deeebe035d="Gooly"]PS. Overigens ben ik momenteel bezig met een nieuw experiment, waarbij ik de tijd van het formulier parsen en het terug ontvangen van data ga bijhouden in een sessie. Als dat dan minder is dan b.v. 5 seconden, dat het dan niet klopt omdat iemand een bepaalde tijd nodig heeft om het formulier in te vullen.[/quote:deeebe035d]Ik weet niet welke bot jou lastig valt, maar de meesten zijn al wel bekend met die tactiek. Ze maskeren hun gedrag simpelweg door even 10 seconden te wachten. 't Kan helpen hoor, maar ik ben bang dat het hem niet gaat worden voor je.
  • [quote:af389c3635="Ger"]Ik zeg niet dat het waterdicht is (schud het net uit mijn mouw)[/quote:af389c3635]
    Hahaha, of ik mezelf hoor praten :lol:
    Maar je brengt me wel op een idee met die jQuery. Want volgens mij lezen bots ook geen javascript. Dankzij je reactie kwam ik op het idee om het formulier helemaal via jQuery te genereren. Geen Javascript, geen formulier.

    Ik stel me dat als volgt voor:
    Een template met de form elementen (ik wil wel wat flexibilteit hebben)
    PHP script leest template en genereerd jQuery code in de head sectie van de pagina.
    In de HTML pagina, op de plek waar het formulier komt zet je b.v. [code:1:af389c3635]<div id="contactform"></div>[/code:1:af389c3635]
    En jQuery voegt het formulier in mbv 'append'

    En voor de zekerheid kan ik daar bovenop dan nog Askimet of Project Honeypot implementeren. (nog even kijken hoe dat moet, ik neem aan dat ze een api hebben?)

    Ik ga eens aan de slag
  • http://akismet.com/development/api/ (voor commercieel gebruik hangt hier trouwens wel een klein prijskaartje aan, $5,- per maand)
    en
    https://www.projecthoneypot.org/httpbl_api.php
  • Bedankt!
    Als het allemaal goed werkt post ik de hele meuk hier :)
  • Succes :)

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.