Beveiliging van een formulier met een som
Auteur: qubus - 28 september 2011 - 18:56 - Gekeurd door: Koen - Hits: 4682 - Aantal punten: (0 stemmen)
Omdat ik veel klachten kreeg over een capcha plaatje op mijn site, ben ik eens gaan experimenteren met een andere manier van beveiligen van een formulier.
Onderstaande code bestaat uit een functie die ik nu hiervoor gebruik, en een voorbeeld van implementatie.
Tot heden heb ik geen last van spam gehad, en lijkt het prima te werken. Opmerkingen en/of verbeteringen altijd welkom
Code:
functie.php:
<?php
function som() {
// Sessie starten
session_start();
$getallen = array(
1=>'een',
2=>'twee',
3=>'drie',
4=>'vier',
5=>'vijf',
6=>'zes',
7=>'zeven',
8=>'acht',
9=>'negen',
10=>'tien',
11=>'elf',
12=>'twaalf',
13=>'dertien',
14=>'veertien',
15=>'vijftien',
16=>'zestien',
17=>'zeventien',
18=>'achttien',
19=>'negentien',
);
$methode = rand(1,3); // willekeurig vermenigvuldigen, optellen of aftrekken
$max = ($methode == 1) ? 9 : 19; // Sommen niet te moeilijk maken bij vermenigvuldigen
$getal1 = rand(1,$max);
$getal2 = rand(1,$max);
if ($methode == 3 && $getal2 > $getal1) { // getallen omdraaien als uitkomst negatief zou zijn
$getal3 = $getal1;
$getal1 = $getal2;
$getal2 = $getal3;
}
switch ($methode) {
case 1:
$som = $getallen[$getal1] . " x " . $getallen[$getal2] . " = ";
$_SESSION['uitkomst'] = $getal1 * $getal2;
break;
case 2:
$som = $getallen[$getal1] . " + " . $getallen[$getal2] . " = ";
$_SESSION['uitkomst'] = $getal1 + $getal2;
break;
case 3:
$som = $getallen[$getal1] . " - " . $getallen[$getal2] . " = ";
$_SESSION['uitkomst'] = $getal1 - $getal2;
break;
}
return($som);
}
?>
<?php
function som( ) {
// Sessie starten
1 => 'een' ,
2 => 'twee' ,
3 => 'drie' ,
4 => 'vier' ,
5 => 'vijf' ,
6 => 'zes' ,
7 => 'zeven' ,
8 => 'acht' ,
9 => 'negen' ,
10 => 'tien' ,
11 => 'elf' ,
12 => 'twaalf' ,
13 => 'dertien' ,
14 => 'veertien' ,
15 => 'vijftien' ,
16 => 'zestien' ,
17 => 'zeventien' ,
18 => 'achttien' ,
19 => 'negentien' ,
) ;
$methode = rand ( 1 , 3 ) ; // willekeurig vermenigvuldigen, optellen of aftrekken $max = ( $methode == 1 ) ? 9 : 19 ; // Sommen niet te moeilijk maken bij vermenigvuldigen
if ( $methode == 3 && $getal2 > $getal1 ) { // getallen omdraaien als uitkomst negatief zou zijn
$getal3 = $getal1 ;
$getal1 = $getal2 ;
$getal2 = $getal3 ;
}
switch ( $methode ) {
case 1 :
$som = $getallen [ $getal1 ] . " x " . $getallen [ $getal2 ] . " = " ;
$_SESSION [ 'uitkomst' ] = $getal1 * $getal2 ;
break ;
case 2 :
$som = $getallen [ $getal1 ] . " + " . $getallen [ $getal2 ] . " = " ;
$_SESSION [ 'uitkomst' ] = $getal1 + $getal2 ;
break ;
case 3 :
$som = $getallen [ $getal1 ] . " - " . $getallen [ $getal2 ] . " = " ;
$_SESSION [ 'uitkomst' ] = $getal1 - $getal2 ;
break ;
}
return ( $som ) ;
}
?>
De variabele $som bevat nu een string met de uitgeschreven som. Dus bijvoorbeeld: 'vijf x negen = '
Het antwoord van de som staat in $_SESSION['uitkomst'] ter controle
Gebruik kan als volgt, waarbij 'code' de naam is van het tekstvak met het antwoord:
<?php
include("functie.php");
if ($_SERVER['REQUEST_METHOD'] == "POST") {
if ($_SESSION['uitkomst'] != $_POST['code']){
// Afhandeling indien antwoord fout
} else {
// Afhandeling indien antwoord goed
}
}
<?php
include ( "functie.php" ) ;
if ( $_SERVER [ 'REQUEST_METHOD' ] == "POST" ) {
if ( $_SESSION [ 'uitkomst' ] != $_POST [ 'code' ] ) {
// Afhandeling indien antwoord fout
} else {
// Afhandeling indien antwoord goed
}
}
Download code (.txt)
Stemmen
Niet ingelogd.