Spam uit het contactformulier van PrestaShop: waarom een antispam met verboden woorden niet werkt
Twee manieren om tijd te verliezen, en de tweede is erger
In de mailbox die de berichten van het contactformulier ontvangt, komen twee soorten berichten binnen: vragen van klanten en ongevraagde voorstellen, dat wil zeggen zoekmachineoptimalisatie, netlinking, ontwikkelaars per uur, uitnodigingen om in cryptovaluta te investeren en, af en toe, een poging om de inloggegevens van de back-office los te krijgen.
De eerste manier om tijd te verliezen is alles lezen. De tweede, erger, is ophouden met lezen: als bijna alles rommel is, wordt het goede bericht nog maar vluchtig bekeken. Een verloren contact laat geen fout achter in de logs, het laat een klant achter die weggaat zonder te zeggen waarom.
Waarom een lijst met verboden woorden niet werkt
De meest gebruikte verdediging is een lijst met woorden: staat ‘SEO’, ‘gratis’ of ‘aanbieding’ in het bericht, dan gaat het weg. Dat werkt een week, daarna komt de rekening, want de woorden die in spam voorkomen zijn dezelfde als die klanten gebruiken. ‘Ik zag dat u een actie hebt op de set schroevendraaiers, is de verzending gratis boven 49 euro, ook naar de eilanden?’ is een klant die op het punt staat te kopen.
De fout zit niet in de lijst maar in de methode: een woord draagt de bedoeling van wie het schreef niet met zich mee. Dat geldt ook andersom, want goed geschreven spam bevat geen enkel verdacht woord. Wordt de lijst strenger gemaakt, dan blokkeert u meer echte klanten; wordt ze milder gemaakt, dan komt er meer spam door: geen enkele instelling lost het probleem op, omdat het niet het juiste signaal is.

Waarom een captcha niet volstaat
Een captcha lost een ander probleem op, en lost het goed op: het belet een programma het formulier duizenden keren in te vullen. Het belet niet dat een persoon een commercieel voorstel verstuurt, en ook niet dat een programma dat het kan oplossen hetzelfde doet. Captcha, honeypot en een limiet op verzendingen per IP kijken naar hoe het bericht is binnengekomen; hier is het probleem wat erin staat.

Een model dat beslist in plaats van schrijft
Het antwoord dat nu in de mode is op ‘is dit bericht spam?’ is een taalmodel ondervragen: u schrijft een prompt en hoopt dat de teruggegeven tekst te interpreteren is. Dat werkt tot de dag dat het model antwoordt ‘Ik zou zeggen van wel, al hangt het ervan af’, en de code die JA of NEE verwachtte op goed geluk beslist.
Er bestaat een type model dat is bedacht voor het omgekeerde geval: het genereert geen tekst, maar antwoordt op getypeerde vragen. Het geeft voor elke vraag een getal terug: bij een ja/nee-vraag de kans dat het antwoord ja is; bij een meerkeuzevraag de gekozen optie, de kans van elke optie en een betrouwbaarheidsindex, dat wil zeggen hoe duidelijk die keuze is ten opzichte van de andere. De functie Antispam Jev van onze module voor contactformulieren is gebouwd op een van deze modellen, Jev van TypeSafe AI.
Het praktische verschil is dat de beslissing in de code blijft: het model zegt hoe zeker het is, en wat u daarmee doet, wordt bepaald door een drempel die de winkelier kan aanpassen. Voor elk bericht gaan zes vragen in één aanroep weg, die parallel worden beoordeeld: is het ongevraagde reclame, bevat het verdachte links, is het phishing, is het een massaal verstuurd sjabloon, welke afdeling moet antwoorden, is het urgent.

Het belangrijkste punt is de derde toestand. Boven de hoge drempel handelt u en gaat het bericht naar een wachtrij met verdachte berichten; eronder doet u niets, het komt erdoor en de beoordeling blijft in het logboek; ertussen, waar het model twijfelt, is de bevestiging van een tweede signaal nodig. ‘Ik weet het niet’ is een nuttig antwoord, als de code is geschreven om ernaar te luisteren.

Wat we hebben gemeten
Deze cijfers komen uit een test die we hebben gedaan op een ontwikkelinstallatie van PrestaShop 9, niet uit een onafhankelijke test: tien berichten die wij in het Italiaans hebben opgesteld, zes legitieme en vier ongewenste.
De zes legitieme berichten waren gekozen omdat ze moeilijk zijn: een boze klant die een terugbetaling vraagt en dreigt de betaling bij zijn bank te betwisten, een bericht geheel in hoofdletters, een met de link naar de site van zijn bedrijf, een heel lang en verward bericht, een van twee woorden in het Italiaans (‘Leveren jullie in Sicilië?’) en het bericht vol ‘gratis’, ‘aanbieding’ en ‘actie’. Alle zes kwamen erdoor, met een kans op ongevraagde reclame die bleef op 2% of lager. De vier ongewenste berichten (SEO-voorstel, phishing met een verkorte link, uitnodiging om te investeren, algemeen massaal verstuurd sjabloon) gingen allemaal naar de wachtrij met verdachte berichten, tussen 98% en 99%.
De tien aanroepen duurden tussen 535 en 663 milliseconden, met een gemiddelde van 596 ms, bij een verbruik van ongeveer 900 tot 1.240 tokens per bericht. Met de functie uitgeschakeld duurde dezelfde verzending 95 ms: de halve seconde extra is de prijs van de beoordeling, en u betaalt die alleen als u de functie inschakelt.
De test die ons het meest interesseerde, was een andere: we lieten de module wijzen naar een adres dat niet antwoordt. Na 4.057 milliseconden, dat wil zeggen de ingestelde wachttijd, werd het bericht gewoon afgeleverd en werd de fout in het logboek vastgelegd. Hetzelfde gebeurde bij een ontbrekende sleutel en bij een foute sleutel.

Wat het met opzet niet doet
Het verwijdert niets. Herkende spam gaat naar een wachtrij die de winkelier opent en leest, en waaruit hij met één klik een bericht kan terughalen, waarna de bijbehorende melding alsnog wordt verstuurd. De bezoeker ziet hoe dan ook het bevestigingsscherm: wie spam verstuurt, krijgt niet uitgelegd hoe hij is gefilterd, en een klant die er per vergissing in terecht zou komen, wordt niet afgewezen.
Het gaat niet in tegen de keuzes van de winkelier: de doorverwijzing kiest uit de afdelingen die echt in de module zijn ingesteld en grijpt alleen in waar eerder het algemene adres zou zijn gebruikt. Onder de betrouwbaarheidsdrempel blijft de standaardontvanger gelden.
De beperkingen, vooraf gezegd
De tekst van het bericht wordt verstuurd naar een externe dienstverlener in de Verenigde Staten: dat is een doorgifte van persoonsgegevens buiten de Europese Unie, die moet worden vermeld in het privacybeleid van de winkel. Daarom is de functie standaard uitgeschakeld, staat in het paneel met zoveel woorden wat er naar buiten gaat en naar wie, is het meesturen van het e-mailadres van de afzender uitgeschakeld tenzij u er uitdrukkelijk voor kiest, en levert de module een kant-en-klare zin voor het privacybeleid in vijf talen: een tekst om aan te passen en te laten controleren, geen juridisch advies.
De dienst is recent en wordt op verbruik gefactureerd: als het tegoed op is, houdt hij op met antwoorden en komen de berichten erdoor zoals bij elke andere fout. En tien berichten zeggen dat het filter zich bij die tien niet heeft vergist, niet dat het zich nooit zal vergissen: daarom bestaat de wachtrij, en daarom wordt elke beoordeling opgeslagen met kans, betrouwbaarheid, tijd en tokens.
Waar u het vindt
Antispam Jev is een functie van onze module voor contactformulieren voor PrestaShop, geen aparte module: wie de module al gebruikt, vindt de functie in de configuratie, uitgeschakeld. Herkent u het tweede probleem uit dit artikel, het echte bericht dat tussen de andere verloren gaat, dan is het daarvoor gemaakt.


