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