Ja nu behøver man jo ikke at bruge session_start() for at sette en session vadi hos brugeren, så vil det ikke være mere krævende end at sende et sessionid med _GET og stadivæk være mere sikkert, da det ville være svære for brugeren at ændre sessionid.
Jeg kan godt give et eksempel.
Her skal bruger skrive de bogstaver som står på billede, så vi skal vide hvad der skal stå.
Lav 2 filer captcha.php og index.php
<?php
/* ------- captcha.php ------- */
$time = time();
$pasw = 'captcha password'; /* Et password som kun du kenner. (Samme password i filen index.php) */
$captcha = '';
$captchaord = 'ABCEFK23456789PQRTVY';
while ( strlen($captcha) < 4 )
{
$ord = $captchaord[rand(0, 19)];
if (!strstr($captcha, $ord))
{
$captcha .= $ord;
}
}
/*
Setter sessionid hos brugeren.
Brug dem her, hvis der er behov for at slette session.
header('Set-Cookie: captchaid=deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT');
*/
header('Set-Cookie: captchaid='.md5($_SERVER['REMOTE_ADDR'].$captcha.$pasw.$time).dechex($time).'; path=/; domain=.'.$_SERVER['SERVER_NAME']);
/*
Laver et billede med de bogstaver som brugeren skal skrive.
Dette er KUN et eksempel, se beder metode her :
http://www.softwaresecretweapons.com/jspwiki/watercap_strong_php_captcha_with_negative_spaces_and_shadows */
header("Content-type: image/png");
$im = @imagecreate(45, 20);
$background_color = imagecolorallocate($im, 128, 128, 128);
$text_color = imagecolorallocate($im, 200, 200, 200);
imagestring($im, 5, 5, 2, $captcha, $text_color);
imagepng($im);
imagedestroy($im);
/* /------- captcha.php ------- */
?>
<?php
/* ------- index.php ------- */
$time = time();
$pasw = 'captcha password'; /* Et password som kun du kenner. (Samme password i filen captcha.php) */
$timeout = 300; /* 5 minutter (Den tid en bruger må bruge på at udfylde formular, før der ikke kan postes med de nøgler som er sat.) */
$remote = $_SERVER['REMOTE_ADDR']; /* Brugerens IP-adresse */
$captcha = isset($_POST['captcha'])?$_POST['captcha']:''; /* De bogstaver som brugeren poster. */
$captchaid = isset($_COOKIE['captchaid'])?$_COOKIE['captchaid']:''; /* Henter vores eget sessionid */
$sisesid = substr($captchaid, 0, 32); /* Bogstaver pakket ind i en md5-hashing (captcha.php) */
$sistime = hexdec(substr($captchaid, 32)); /* Tiden pakket ind i en hex (captcha.php) */
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $sisesid != '' && $sistime != '' && $captcha != '')
{
if ($sistime > ($time-$timeout) && $sistime < $time && $sisesid == md5($remote.$captcha.$pasw.$sistime))
{
echo '<pre>';
print_r($_POST);
echo '</pre>';
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"
http://www.w3.org/TR/html4/loose.dtd"><html>
<head>
<title>Nyt Dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
window.onload = function()
{
if (document.cookie.length < 32)
{
alert('Din browser tilleder ikke session undersøgelse!');
}
};
</script>
</head>
<body>
<form action="<?=$_SERVER['PHP_SELF'];?>" method="post">
Navn: <input type="text" name="name" value="" /><br />
Captcha: <input type="text" name="captcha" value="" size="8" maxlength="4" />
<img src="captcha.php?time=<?=time();?>" width="45" height="20" alt="" /><br />
<input type="submit" value=" Send " />
</form>
</body>
</html>
<!------- index.php ------->
Når der så er posted, prøv så at trykke F5 og se, så kan der ikke postes med den nøgle igen.