anti bot
Weet iemand een goede tutorial hoe zo'n anti bot veld kan maken?
Daarnaast kan een captcha vaak helpen.
Quote:
Je kan een onzichtbare checkbox maken (display:hidden),
Trappen ze daar nog in?
Ik merk van wel, en anders altijd een goede captcha.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php session_start();
if(isset($_POST['Submit'])){
// code for check server side validation
if(empty($_SESSION['captcha_code'] ) || strcasecmp($_SESSION['captcha_code'], $_POST['captcha_code']) != 0){
$msg="<span style='color:red'>The Validation code does not match!</span>";// Captcha verification is incorrect.
}else{// Captcha verification is Correct. Final Code Execute here!
$msg="<span style='color:green'>The Validation code has been matched.</span>";
}
}
?>
<form action="" method="post" name="form1" id="form1" >
<table width="400" border="0" align="center" cellpadding="5" cellspacing="1" class="table">
<?php if(isset($msg)){?>
<tr>
<td colspan="2" align="center" valign="top"><?php echo $msg;?></td>
</tr>
<?php } ?>
<tr>
<td align="right" valign="top"> Validation code:</td>
<td><img src="captcha.php?rand=<?php echo rand();?>" id='captchaimg'><br>
<label for='message'>Enter the code above here :</label>
<br>
<input id="captcha_code" name="captcha_code" type="text">
<br>
Can't read the image? click <a href='javascript: refreshCaptcha();'>here</a> to refresh.</td>
</tr>
<tr>
<td> </td>
<td><input name="Submit" type="submit" onclick="return validate();" value="Submit" class="button1"></td>
</tr>
</table>
</form>
if(isset($_POST['Submit'])){
// code for check server side validation
if(empty($_SESSION['captcha_code'] ) || strcasecmp($_SESSION['captcha_code'], $_POST['captcha_code']) != 0){
$msg="<span style='color:red'>The Validation code does not match!</span>";// Captcha verification is incorrect.
}else{// Captcha verification is Correct. Final Code Execute here!
$msg="<span style='color:green'>The Validation code has been matched.</span>";
}
}
?>
<form action="" method="post" name="form1" id="form1" >
<table width="400" border="0" align="center" cellpadding="5" cellspacing="1" class="table">
<?php if(isset($msg)){?>
<tr>
<td colspan="2" align="center" valign="top"><?php echo $msg;?></td>
</tr>
<?php } ?>
<tr>
<td align="right" valign="top"> Validation code:</td>
<td><img src="captcha.php?rand=<?php echo rand();?>" id='captchaimg'><br>
<label for='message'>Enter the code above here :</label>
<br>
<input id="captcha_code" name="captcha_code" type="text">
<br>
Can't read the image? click <a href='javascript: refreshCaptcha();'>here</a> to refresh.</td>
</tr>
<tr>
<td> </td>
<td><input name="Submit" type="submit" onclick="return validate();" value="Submit" class="button1"></td>
</tr>
</table>
</form>
Maar hoe zorg ik ervoor dat als de captcha is ingevuld dat daarna de form wordt verzonden>?
Ik dacht er eerst aan om de php hier in te zetten.
}else{// Captcha verification is Correct. Final Code Execute here!
$msg="<span style='color:green'>The Validation code has been matched.</span>";
} (regel 8)
Maar dat werkt niet.
Edit:
Code-tags toegevoegd. Gelieve deze voortaan zelf te plaatsen. Zie ook:
http://www.phphulp.nl/veel-gestelde-vragen/
http://www.phphulp.nl/veel-gestelde-vragen/
Gewijzigd op 08/11/2015 15:12:24 door - Ariën -
Mits de code in captcha.php klopt zou het bovenstaande moeten werken, je zult wel direct de data in $_POST moeten verwerken, want deze is al verzonden naar de server bij het vorige request.
Ook lijkt het mij onwenselijk om output te produceren (een pagina weer te geven) terwijl je bezig bent met de verwerking van een formulier. Dit zorgt bijna altijd voor spaghetti-code (if-elseif-elseif-else constructies). Verwerk je formulier in een aparte (tussen)stap waarbij je:
- eerst je invoer filtert/valideert (kloppen alle gegevens)
- en (zoja) vervolgens het formulier verwerkt
- en (zonee) je het formulier opnieuw toont met een foutmelding
Indien filtering/validatie + opslag geslaagd is stuur je de gebruiker door naar een succespagina of (terug) naar een overzicht.
Gebruik bij voorkeur deze constructie.
Ariën noemde al een methode (dit wordt geloof ik een "honeypot" genoemd). Je kunt ook het omgekeerde doen: voeg met JavaScript een verplicht (onzichtbaar) veld toe waar je op controleert. Bestaat deze niet dan pech. Je verplicht hiermee de gebruiker wel om JavaScript ingeschakeld te hebben maar dat is tegenwoordig niet zo'n onredelijke eis.
En dan kun je nog een token toevoegen aan je formulier. Dit volgt min of meer hetzelfde principe als een CAPTCHA. Je genereert een random token wat je meestuurt als onzichtbaar formulier element, en tevens sla je deze op in je sessie. Na submitten leg je beide weer naast elkaar om te zien of ze gelijk zijn.
Deze sessie-data zou trouwens direct na gebruik meteen weer gewist moeten worden, anders kun je deze data (eindeloos) hergebruiken, en dat lijkt mij weer niet de bedoeling.
Ik denk dat ik snap wat je allemaal probeert uit te leggen, maar kun je niet een practice oplossing geven bijv naar een pagina of tut verwijzen?
Ik snap hoe dat werkt, maar hoe verwerk ik erin als dat gedaan is dat mijn form dan pas wordt verzonden naar de database.
Met isset() kijken of die checkbox ingevuld is. Zo ja, zet het ip op een blacklist en anders doe je je INSERT INTO.
- alles OK, invoegen in database, na afloop doorverwijzen naar succespagina of overzicht
- niet alles OK, terug naar formulier
Waar loop je specifiek tegenaan? Je weet niet precies hoe de code voor deze gevallen er uit dient komen te zien?
Thomas van den Heuvel op 08/11/2015 15:55:00:
Ariën noemde al een methode (dit wordt geloof ik een "honeypot" genoemd). Je kunt ook het omgekeerde doen: voeg met JavaScript een verplicht (onzichtbaar) veld toe waar je op controleert. Bestaat deze niet dan pech. Je verplicht hiermee de gebruiker wel om JavaScript ingeschakeld te hebben maar dat is tegenwoordig niet zo'n onredelijke eis.
Als je dan toch Javascript gebruikt kan je ook gewoon het gehele formulier inladen via AJAX, valt er voor een bot helemaal niets versturen ;-)
Ik denk dat het verbergen van velden een beetje achterhaald is.
Persoonlijk zou ik met AngularJS of jQuery een validatie laten lopen die bepaalde velden checkt.
Ook de php code zou ik laten valideren op velden.
Geen captcha gebruiken is velen maten vriendelijker en hoe meer validatie jij loslaat op bepaald velden, hoe minder bots erdoorheen komen.
Google heeft niet voor niets zijn REcaptcha veranderd ;)
Kun je mis voorbeelden sturen of een link naar een tutorial want ben nog niet zo gevorderd..:/
Een 'honeypot' lijkt mij de beste methode. Eventuele kan je Google Re-Captcha gebruiken. Deze gebruikt mooie algoritmes om te kijken of het netwerk van de bezoeker betrouwbaar is. Botnets maken dan grote kans om een lastige captcha voor hun kiezen te krijgen.
Maar mijn vraag was of er een voorbeeld of tutorial was over hoe je eerst de captcha checkt en dan daarna de form verzend naar de database
vorige bericht. Daar staat vermeld waar je je code kan uitvoeren, die plaats moet vinden als de captcha gelukt is.
Laat anders eens zien wat je hebt geprobeerd.
Zie je Laat anders eens zien wat je hebt geprobeerd.
DavY - op 10/11/2015 20:01:45:
Dat snap ik maar eerst moet gecheckd worden of de captcha goed is ingevuld en dan mag het pas verzonden worden
Gewijzigd op 10/11/2015 20:48:51 door Marcel Groot
Er staat duidelijk 'Final Code Execute here!' in jouw geplaatste script. Dus daar kan je je afhandeling plaatsen.
Ja maar als ik het erin plaats krijg ik errors.