Zur Loginbestätigung eine Zahl abtippen. Die AUTHFILE darf von außen nicht abrufbar sein, sonst ist die Sicherheit dahin :) An der Stelle, die nur nach Bestätigung aufrufbar sein soll, einfach die Funktion aufrufen und bei Rückgabewert false abbrechen.
<?php
if(!checkForHumanity()) die();
?>
Hier der Code:
<?php
/*
"Captcha" - Zahl zur Bestätigung abtippen
Aktion: PHP Scripte für die armen dieser Welt
Der Erlös geht für mein Pausenbrot drauf
Copyright (c) 2006 by Phillip 'Firebird' Berndt
*/
define('AUTHFILE', '.auth');
// Authentifizierung zur Überprüfung, ob auf der Gegenseite ein Mensch sitzt
function checkForHumanity()
{
if(file_exists(AUTHFILE))
$dataFile = unserialize(file_get_contents(AUTHFILE));
else
$dataFile = array();
// IP Sperre
foreach($dataFile as $key => $userData)
{
if($userData[0] + 3600 * 5 < time())
unset($dataFile[$key]);
}
// Login okay?
$userData = &$dataFile[$_SERVER['REMOTE_ADDR']];
if(isset($userData['loginOkay']))
return true;
if(isset($userData[1]) && $_POST['hash'] == $userData[1])
{
$userData['loginOkay'] = true;
file_put_contents(AUTHFILE, serialize($dataFile));
return true;
}
// Bild ausgeben
if(isset($_GET['getImage']))
{
srand(time());
$randomString = base_convert(rand(10000, 1e6), 10, 36);
$userData = Array(time(), $randomString);
$image = imagecreate(100, 20);
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 2, 5, 5, $randomString, $black);
ob_end_clean();
header('Content-Type: image/jpeg');
imagejpeg($image);
file_put_contents(AUTHFILE, serialize($dataFile));
die();
}
// Texteingabe ausgeben
// An dieser Stelle beliebige weitere Meldungen ausgeben
echo('<form method="post" action="'.$_SERVER['REQUEST_URI'].'"><p>'.
'<img src="'.$_SERVER['REQUEST_URI'].'&getImage=1" alt="Bestätigungsbild" /><br/>'.
'<input type="text" value="" name="hash"/> <input type="submit"/></p></form>');
file_put_contents(AUTHFILE, serialize($dataFile));
return false;
}
?>