Scripts
Nog een Captcha
Naar aanleiding van alle CAPTCHA* ophef heb ik ook maar eens een script geschreven. * http://www.phphulp.nl/php/scripts/8/929/ http://www.phphulp.nl/php/scripts/1/926/ Maar als het bovenste voorbeeld gevorderd is, wat is dit dan? :p Genoeg uitgelegd! Schematische werking: 1. Er wordt een randomstring gegenereerd van een aantal tekens naar keuze ($iDigits). Tegelijkertijd kent hij aan 4 variabelen het aantal cijfers, letters, de desbetreffende cijfers en de desbetreffende letters toe. 2. d.m.v. rand() wordt een vraagstelling gekozen, die betrekking heeft op de string. 3. De waarde van het antwoord dat bij de vraag wordt word d.m.v. een sessie opgeslagen. 4. Waarde wordt verstuurd en gecontroleerd. Ik hoop het bruikbaar materiaal is. :)
nog-een-captcha
<?php
# Door: Pieter van Linschoten
# Datum: 7 Maart 2007
# E-mail: webmaster @ lapidi . nl
# Website: http://www.lapidi.nl
# Tevens origineel beschikbaar: www.phphulp.nl
# Rechten: GNU General Public Licence
# Voorbeeld: http://www.lapidi.nl/captcha.php
session_start();
// Bepaal of script de code moet verwerken of nieuwe code aanmaken
if(!isset($_GET['action'])){
// Initialiseer array digits.
$digits = array();
$digits[0] = 'A'; $digits[1] = 'B'; $digits[2] = 'C';
$digits[3] = 'D'; $digits[4] = 'E'; $digits[5] = 'F';
$digits[6] = 'G'; $digits[7] = 'H'; $digits[8] = 'I';
$digits[9] = 'J'; $digits[10] = 'K'; $digits[11] = 'L';
$digits[12] = 'M'; $digits[13] = 'N';
$digits[14] = 'P'; $digits[15] = 'Q'; $digits[16] = 'R';
$digits[17] = 'S'; $digits[18] = 'T'; $digits[19] = 'U';
$digits[20] = 'V'; $digits[21] = 'W'; $digits[22] = 'X';
$digits[23] = 'Y'; $digits[24] = 'Z'; $digits[25] = '1';
$digits[26] = '2'; $digits[27] = '3'; $digits[28] = '4';
$digits[29] = '5'; $digits[30] = '6'; $digits[31] = '7';
$digits[32] = '8'; $digits[33] = '9';
// Om verwarring te voorkomen 0 en O niet inbegrepen.
$iDigits = 8; // Uit hoeveel tekens moet de Captcha bestaan?
// Initialiseren van variabelen. Strings (v) en Integers (i).
// Ik zet er ook bij waarovor ik ze gebruik. Dit om latere verwarring te vermijden.
$iRand = 0; // Random integer: Bepaald welk teken in de captcha komt
$iCount = 0; // Forloop teller
$vChars = NULL; // String die captcha bijhoud
$Char = NULL; // Enkele nummer, verandert steeds
$vNum = NULL; // Alle nummers uit de captcha achter elkaar
$iNum = 0; // Telt nummers
$vLetter = NULL;// Alle letters uit de captcha achter elkaar
$iLetter = 0; // Telt letters
$iAction = 0; // Random integer: Bepaald welke vraag wordt gesteld
$vAnswer = NULL;// String met antwoord op desbetreffende vraag
$vQuestion = NULL;// String met eerste gedeelte van de vraag
$_SESSION['sAnswer'] = NULL; // Sessievariabele met het antwoord
// Selecteer $iDigits maal een RANDOM string en stel de antwoorden voor de mogelijke vragen samen.
for($iCount=0;$iCount<$iDigits;$iCount++){
$iRand = rand(0,count($digits)-1);
$Char = $digits[$iRand];
$vChars .= $Char;
if(is_numeric($Char)){
// Houdt cijfers in de captcha achter elkaar en aantal cijfers bij
$vNum .= $Char;
$iNum++;
}else{
// Houdt letters in de captcha achter elkaar en aantal letters bij
$vLetter .= $Char;
$iLetter++;
}
}
// Bepaal wat voor vraag er wordt gesteld, om bots te verwarren.
$iAction = rand(0,3);
switch($iAction){
case 0:
$vQuestion = 'Hoeveel cijfers';
$vAnswer = $iNum;
break;
case 1:
$vQuestion = 'Hoevel letters ';
$vAnswer = $iLetter;
break;
case 2:
$vQuestion = 'Welke cijfers';
$vAnswer = $vNum;
break;
case 3:
$vQuestion = 'Welke letters';
$vAnswer = $vLetter;
break;
}
// Sla het antwoord op in een sessie, die afgeschermt zijn voor bots.
$_SESSION['sAnswer'] = $vAnswer;
// Captcha + Vraag
echo "<p><b>" . $vChars . "</b></p>";
echo "<p><u>" . $vQuestion . "</u> bevat het bovenstaande dikgedrukte gedeelte?</p>";
// Formuliertje:
echo "<form method=post action='". $_SERVER['PHP_SELF'] ."?action=check'>";
echo "<input type='text' name='code'";
echo "<input type='submit' value='Controleer'>";
echo "</form>";
echo "<p>N.B.: Alle tekens moeten op volgorde van links naar rechts en zijn hoofdlettergevoelig!</p>";
}else{
// Mogelijke verwerking:
// Controleer of de variabele niet leeg is.
if(empty($_SESSION['sAnswer'])){
echo "<p><b>Helaas!</b> Er is geen geldig antwoord, aangezien er niets is gevraagd.</p>"; // Lege string > foutmelding
// Kijk of het antwoord klopt.
}elseif($_SESSION['sAnswer'] == $_POST['code']){
echo "<p><b>Goed!</b> Je bent een mens of een HELE slimme bot!</p>"; // Goed antwoord > Hier moet dus de verwerking komen!
// Indien fout antwoord.
}else{
echo "<p><b>Helaas!</b> Geen toegang voor BOTS en Analfabeten!</p>"; // Fout antwoord > foutmelding
}
// Altijd handig om het nogmaals te proberen :)
echo "<p><a href='" . $_SERVER['PHP_SELF'] . "'>Vorige</a></p>";
session_destroy();
}
?>
Reacties
0