Weet iemand een goede tutorial hoe zo'n anti bot veld kan maken?
Je kan een onzichtbare checkbox maken (display:hidden), en als die aangevinkt is wat bots altijd doen, dan stop je direct het script.

Daarnaast kan een captcha vaak helpen.

Je kan een onzichtbare checkbox maken (display:hidden),


Trappen ze daar nog in?
Ik merk van wel, en anders altijd een goede captcha.
Ik heb denk ik een goede captcha.

<?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>


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.

Je if-statement leest alles behalve prettig. In plaats van te controleren of het niet zo is dat de captcha check niet goed is (dubbele ontkenning), kun je beter controleren of de captcha check wel goed is. In sommige gevallen levert een dubbele ontkenning ook niet het gewenste resultaat op (in dit geval geloof ik wel, maar het kost gewoon teveel moeite om dat te ontcijferen. Stel dat hier ergens een bug in zit, je wilt dit soort code toch niet gaan ontleden?).

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.
@Marcel, je doet het tegelijkertijd, maar na elkaar :). In de "actie" waar je je formulier naartoe POST controleer je eerst de invoer, en dan besluit je -direct hierna, in dezelfde actie- wat je doet:
- 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?

Reageren