Hallo,
Zojuist even bezig geweest met een "proof of concept" script om online formulieren te weren tegen spam-bots zonder captcha e.d.
Het probeert via 4 verschillende manieren te bepalen of een inzender een spambot is of niet.
1. Kijken of de http_referer overeenkomt met deze pagina, maar dit is relatief simpel te omzeilen
2. Opslaan hoe lang men over elk veld doet. Een spambot vult alles in 1x in, terwijl een echte bezoeker meer tijd nodig heeft om de velden in te vullen
3. Een "honeypot", een valide uitziend formulierveld die echter verborgen wordt voor echte bezoekers. Bots zien dit veld wel en vullen in het algemeen alles in.
Alle formulier velden hebben een nummer in plaats van naam, zodat het minder makkelijk er uit te filteren is voor spam-bots.
4. Kijkt of er specifieke woorden in terugkomen zoals viagra,ejaculation,jackpot etc.
Vervolgens geeft het script bij het verzenden aan of het spam heeft gedetecteerd of niet.
De demo staat hier:
http://smg-studios.com/downloads/contact_form.php
Wat vinden jullie er van, denk je dat het bots tegen zal houden?
En de code (nogmaals, het is enkel een proof of concept, niet een werkend/af contact formulier):
<?php
session_start();
/*
Anti-spam script zonder captcha of andere klantonvriendelijke methodes.
Werking / disclaimer:
Dit anti-spam script is enkel een proof of concept.
Het probeert via 4 verschillende manieren te bepalen of een inzender een spambot is of niet.
1. Kijken of de http_referer overeenkomt met deze pagina, maar dit is relatief simpel te omzeilen
2. Opslaan hoe lang men over elk veld doet. Een spambot vult alles in 1x in, terwijl een echte bezoeker meer tijd nodig heeft om de velden in te vullen
3. Een "honeypot", een valide uitziend formulierveld die echter verborgen wordt voor echte bezoekers. Bots zien dit veld wel en vullen in het algemeen alles in.
Alle formulier velden hebben een nummer in plaats van naam, zodat het minder makkelijk er uit te filteren is voor spam-bots.
4. Kijkt of er specifieke woorden in terugkomen zoals viagra,penis,jackpot etc.
In dit voorbeeld staat de honeypot onderaan.
Het beste is om de honeypot continue te laten verplaatsen/ander nummer e.d.
Vervolgens geeft het script bij het verzenden aan of het spam heeft gedetecteerd of niet.
*/
if(isset($_GET["save_stat"]))
{
// als iemand op het veld komt
if($_GET["type"] == "focus" && is_numeric($_GET["field_id"]))
{
$_SESSION["n_time_".$_GET["field_id"]."_start"] = date("Y-m-d H:i:s");
}
if($_GET["type"] == "blur" && is_numeric($_GET["field_id"]))
{
$_SESSION["n_time_".$_GET["field_id"]."_end"] = date("Y-m-d H:i:s");
$time_start = strtotime($_SESSION["n_time_".$_GET["field_id"]."_start"]);
$time_end = strtotime($_SESSION["n_time_".$_GET["field_id"]."_end"]);
$_SESSION["n_time_".$_GET["field_id"].""] = $time_end - $time_start;
$_SESSION["n_time_set_".$_GET["field_id"].""] = 1;
}
exit;
}
if(isset($_POST["save"]))
{
// Alhoewel makkelijk te omzeilen: kijken of het vanaf deze pagina gepost wordt of extract je domeinnaam als je pagina veel dynamische parameters heeft.
if($_SERVER['HTTP_REFERER'] == '..........')
{
// als de "honeypot" is ingevuld, dan is het een spam bot
if(!empty($_POST["n_5"]))
{
$is_spam = 1;
}
// Spam woorden
$words = array("viagra", "cheapest pills", "ejaculation", "jackpot", "xanax", "enz..");
// loop door elke post en kijk of het is ingevuld en hoe lang ze er over hebben gedaan
for($p=1; count($_POST) > $p; ++$p)
{
// Als het eerste veld binnen 1 seconde is ingevuld. Noot: we checken of de sessie n_time_set_x bestaat, het kan namelijk ook zo zijn dat door welke reden dan ook geen data is opgeslagen.
// Als dat gebeurt ziet deze loop het altijd als spam omdat als de sessie leeg is (0) het kleiner is dan 1.
if(!empty($_POST["n_$p"]) && $_SESSION["n_time_set_$p"] == 1 && $_SESSION["n_time_$p"] <= 1)
{
$spam_score++;
}
// check of een of meer spamwoorden in dit veld gebruikt zijn
//$checkWords = substr_count($_POST["n_$p"], $words);
if (in_array($_POST["n_$p"], $words)) {
$spamwords_score++;
}
}
// bereken totaal aantal posts en aantal keren dat men er te snel over doet
$total_posted = count($_POST) - 1; // post save negeren
$total_spam_probability = $spam_score; // aantal keer dat iemand er wel erg snel over doet.
// Percentage uitrekenen hoeveel % van alle velden te snel is ingevuld
$spam_probability_percentage = ($total_spam_probability / $total_posted) * 100;
$spam_threshold = 60; // percentage, men kan natuurlijk ook informatie in bepaalde formulier velden geplakt hebben en daardoor zo snel zijn.
$spamwords_threshold = 3; // na hoeveel keer een spam woord gevonden te hebben kunnen we concluderen dat het spam is?
if($spam_probability_percentage >= $spam_threshold || $is_spam == 1 || $spamwords_score >= $spamwords_threshold)
{
session_destroy(); // of loop door alle n_time_x sessies
// silent fail: geef aan dat het formulier verzonden is, maar doe er verder niets mee.
echo '<b>SPAM GEDETECTEERD!</b><br><br>';
echo "Spam (snelheid van invullen) %: $spam_probability_percentage (TH = $spam_threshold)<br>";
echo "Is spam: $is_spam<br>";
echo "Spam words score: $spamwords_score (TH = $spamwords_threshold)<br><br>";
}
else
{
session_destroy(); // of loop door alle n_time_x sessies
// geen spam, stuur de mail
echo '<b>GEEN SPAM!</b><br><br>';
echo "Spam (snelheid van invullen) %: $spam_probability_percentage (TH = $spam_threshold)<br>";
echo "Is spam: $is_spam<br>";
echo "Spam words score: $spamwords_score (TH = $spamwords_threshold)<br><br>";
}
}
}
?>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script type="text/javascript">
function stat(type,fid,val) {
// de laatste waarde geeft de waarde van het veld door.
// hierdoor zouden we het script nog meer kunnen uitbreiden, bijv. kijken hoeveel karakters en de tijd die daarvoor nodig zou zijn.
$( ".sink" ).load( './contact_form.php?save_stat=1&type='+encodeURICompo nent(type)+'&field_id='+encodeURIComponent(fid)+'& value='+encodeURIComponent(val)+'' );
}
</script>
<style type="text/css">
/* Noot: dit zou natuurlijk in een css file geplaatst moeten worden en/of via Javascript verborgen moeten worden */
.n_5 {
display:none; /* Honeypot veld */
}
</style>
</head>
<body>
<form action="./contact_form.php" method="POST">
<div class="n_1">Uw voornaam<br>
<input type="text" name="n_1" onfocus="stat('focus','1','')" onblur="stat('blur','1',this.value)"><br><br></div>
<div class="n_2">Uw volledige achternaam<br>
<input type="text" name="n_2" onfocus="stat('focus','2','')" onblur="stat('blur','2',this.value)"><br><br></div>
<div class="n_3">E-mail<br>
<input type="text" name="n_3" onfocus="stat('focus','3','')" onblur="stat('blur','3',this.value)"><br><br></div>
<div class="n_4">Bericht<br>
<textarea name="n_4" rows="6" cols="42" onfocus="stat('focus','4','')" onblur="stat('blur','4',this.value)"></textarea><br><br></div>
<div class="n_5">Telefoonnummer<br>
<input type="text" name="n_5" onfocus="stat('focus','5','')" onblur="stat('blur','5',this.value)"><br><br></div>
<input type="submit" name="save" value="Verzenden">
</form>
<span class="sink"></span>
</body>
</html>
- Wat vind jij van deze anti-spam script zonder captcha e.d.?
-
04-02-2016, 12:57 #1
- Berichten
- 434
- Lid sinds
- 15 Jaar
Wat vind jij van deze anti-spam script zonder captcha e.d.?
-
In de schijnwerper
-
04-02-2016, 13:25 #2
- Berichten
- 49
- Lid sinds
- 14 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Anti-bot formulier is vrij simpel in elkaar te zetten.
Het gaat om welke logica bots gebruiken om een formulier te sturen.
1. Ze scannen naar <form>
2. Vullen alle inputvelden in, met een extra check op name="", bijv. email, zodat er wel een e-mailadres wordt ingevuld
3. Vervolgens gaan ze op zoek binnen form naar een input[type=submit] of een button.
Dit doen alle bots.
Enige verschil is dat de ene bot het via de website doet, en de andere extern vanuit een eigen server (http ref is idd te omzeilen).
De bots die via de website het formulier invullen is heel makkelijk te tricken, zet de submit button buiten de <form> en maak de button customized met een <div>. Wanneer er op de div button wordt geklikt, kun je met jQuery de form submitten.
De bots die extern data verstuurt, pakken de action="url", zodat de bot weet waar die het heen moet sturen.
Haal die action weg. Je kunt met JavaScript de action attribute toevoegen zodra iemand het formulier wilt sturen. Dus eerste preventen, attribute toevoegen, en vervolgens form submit.
Zo simpel is het al om een bot voor de gek te houden. Captcha etc is overbodig, ook onnodige time-controles.
-
04-02-2016, 13:35 #3
- Berichten
- 434
- Lid sinds
- 15 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Ha Benny,
Klopt, alleen leun je op deze manier teveel op enkel JavaScript naar mijn idee.
Wat als iemand JS (tijdelijk) uitgezet heeft of andere beperkingen (zijn er genoeg die zo'n tooltje hebben) of als er ergens (door verloop van tijd het updaten van je website/scripts) een conflict in Jquery ontstaat waardoor het niet (meer) wordt vervangen. Dan werkt je hele formulier niet meer.
Daarnaast zullen er ook slimmere bots zijn / ontstaan die wel basic JS kunnen interpreteren.
Met bovenstaande heb je meerdere lagen die niet van JS afhankelijk zijn.
Wel goed bedacht, de action weglaten en via JS toevoegen ;)
-
04-02-2016, 13:56 #4
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Verstuur een formulier via AJAX en je hebt ten eerste een beter formulier (de pagina hoeft niet vernieuwd te worden) en ten tweede, bots hebben er grote moeite mee. Ik gebruik geen enkele captcha en heb nooit bot berichten op tal van website's.
-
04-02-2016, 19:36 #5
- Berichten
- 1.454
- Lid sinds
- 14 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Volgens mij werkt contact form 7 ook met AJAX toch? Desondanks ontvangen sommige klanten van mij regelmatig zo'n spam formuliertje (geen idee wat het nut daarvan is voor de verzender maar goed).
Ik probeer captcha altijd te vermijden omdat je het bezoekers daarmee moeilijker maakt om contact met je op te nemen en dat kan natuurlijk nooit de bedoeling zijn.
-
04-02-2016, 20:24 #6
- Berichten
- 1.410
- Lid sinds
- 16 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Volgens mij zoeken de bots in de <form> tag naar het "action" attribuut en maken gewoon een submit request naar de pagina die daar staat. Dus volgens mij is de trick om dat atribuut leeg te laten. "action='#'" bijvoorbeeld. En doormidden van Ajax de formulieren naar de juiste bestemming te submitten.
-
04-02-2016, 20:25 #7
- Berichten
- 616
- Lid sinds
- 15 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
http://areyouahuman.com/ - probleem opgelost ;)
-
04-02-2016, 21:43 #8
- Berichten
- 102
- Lid sinds
- 12 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Het kan nog veel eenvoudiger:
Code:<form action="blabla" onsubmit="document.cookie='bezoeker=ja'; this.screenresx.value=screen.width;"> <input type='hidden' name='screenresx'>
Code:<?php if($_COOKIE['bezoeker'] && $_POST['screenresx'] > 0){ } ?>
-
10-02-2016, 11:09 #9
- Berichten
- 33
- Lid sinds
- 19 Jaar
Re: Wat vind jij van deze anti-spam script zonder captcha e.d.?
Bots hebben grote moeite als dat op de achtergrond verstuurd word? Ben ik het niet mee eens. Even 'element inspector' erbij pakken, kijken welke POST velden deze request verstuurd, en de 'grote moeite' is weg voor een klein scriptje dat gebruik maakt van curl.
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic