CAPTCHA
Feladat: beléptető rendszerünket tegyük biztonságosabbá azzal, hogy egy úgynevezett CAPTCHA-t is elhelyezünk a bejelentkező oldalunkon. (CAPTCHA: Comletely Automated Public Turing Test to Tell Computers and Humans Apart = teljesen automatizált nyilvános Turing-teszt számítógépek és emberek megkülönböztetésére). A CAPTCHA lényegében egy kép, melyen véletlenül előállított jelszó látható. Ezt a képbe rejtett jelszót az ember többé-kevésbé könnyen el tudja olvasni, viszont egy optikai karakterfelismerő program már nehezen, mert a jelszó karaktereit rendezetlenül, esetleg torzítva jelenítik meg, illetve zavaró rajzelemek (pontok, vonalak) részben takarják. Ilyen CAPTCHA-t láthatunk a következő belépési felületen, ahol jelszó v7p98u:
Könnyen előfordulhat, hogy a jelszó elrejtése túlságosan is jól sikerül, és még az emberi szem-agy felfogóképességét is próbára teszi. Ha nem vagyunk biztosak némelyik karakterben, akkor legyen lehetőség új kód kérésére. A kérést egy képen való kattintással oldhatjuk meg elegánsan. Keressünk a Google segítségével egy szimpatikus refresh.png képet, például a harmadik sor második képét:
Mentsük a munkakönyvtárunkba a kiválasztottat, mert szükségünk lesz rá:
Egy CAPTCHA képet például a következő php kóddal állíthatunk elő:
<?php
session_start();
define('hossz',6);
define('szel',180);
define('mag',35);
$szov= "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$ekod = "";
$kep = "";
for ($i=0; $i<hossz; $i++){
$n = rand(0,61);
$ekod = $ekod.substr($szov,$n,1);
$kep = $kep.substr($szov,$n,1)." ";
}
$_SESSION['ekod'] = $ekod;
$img = @imagecreate(szel,mag);
$background_color = imagecolorallocate($img,238,238,238);
$szin = rand(40,160);
$text_color = imagecolorallocate($img,$szin,$szin,$szin);
for ($i=0; $i<4; $i++){
imageline($img,0,rand()%mag,szel,rand()%mag,$text_color);
}
for ($i=0; $i<10; $i++){
imageline($img,rand()%szel,0,rand()%szel,mag,$text_color);
}
for ($i=0; $i<160; $i++){
imagesetpixel($img,rand()%szel,rand()%mag,$text_color);
}
imagettftext($img,24,0,3,mag-10,$text_color,"BELLB.TTF",$kep);
header("Content-Type:
image/png");
imagepng($img);
imagedestroy($img);
?>
A böngészővel a header("Content-Type: image/png"); hívással tudatjuk, hogy a ct.php kód által visszaadott lap nem egy html oldal, hanem egy png típusú kép. Futtatva a scriptet a következő képet kapjuk, természetesen minden futtatás után más karaktersort rajta szerepelni.
A rendszert megvalósító állományok (cindex.php az indító fájl):
http://gorbem.hu/PH/cindex.php
<?php
session_start();
ob_start();
include "clogin.php";
ob_end_flush();
?>
A clogin.php oldalban kell gondoskodnunk arról, hogy egyrészt megjelenjen a CAPTCHA, és a rajta látható jelszó (melyet egy SESSION változóba ír a ct.php – $ekod). A módosított bejelentkező oldal most így néz ki:
Másrészt a bejelentkező oldalunknak kell összevetni az $ekod-ot az Ellenőrző kód beviteli mezőjébe írt és POST-olt kóddal, és eldönteni, beléphetünk-e a rendszerbe. Íme, a módosított php kód:
http://gorbem.hu/PH/clogin.php
<?php
session_start();
include "hconfig.php";
if ( !$_SESSION['nlogin'] ){
if ( isset($_POST['login']) ){
$nname = $_POST['nname'];
$pw = $_POST['passw'];
$passw = md5($pw);
$eredm = mysql_query("SELECT * FROM Users WHERE (NName='$nname' AND Passw='$passw') ");
$nnu = mysql_num_rows($eredm);
$nnu = $nnu+0;
if ( ($nnu !== 0) && ($_SESSION['ekod'] == $_POST['ekod']) ){
$_SESSION['nlogin'] = true;
$_SESSION['nname'] = $nname;
header("location: clogin.php");
}
}
?>
<html>
<head>
<title>Beléptető rendszer</title>
</head>
<body bgcolor="#eeeeee">
<script language="JavaScript">
function js(){
document.kep.src = "ct.php?"+Math.random()+"";
}
</script>
<font face="Verdana">
<form action="" method="POST">
<table border="1" bordercolor="#ffffff" cellpadding="10" cellspacing="0" bgcolor="#eeeeee">
<tr><td align="right">A felhasználó login neve: <input type="text" name="nname" size="22" /></td></tr>
<tr><td align="right">Jelszava: <input type="password" name="passw" size="24" /></td></tr>
<tr><td align="right"><img src="ct.php" name="kep" />
<img border=0 src="rfr.png" width="35" height="35" onclick="js()" style="cursor:pointer" /></td></tr>
<tr><td align="right">Ellenőrző kód: <input type="text" name="ekod" size="22" /></td></tr>
<tr><td align="center"><input type="submit" name="login" value="Belépés" /></td></tr>
</table>
</font>
</form>
</html>
<?php
}
else{
print "<html>\n";
print "<head>\n";
print "<title>Védett
tartalom</title>\n";
print "</head>\n";
print "<body>\n";
$nname = $_SESSION['nname'];
print "<font
face=\"Verdana\">";
print "Ez itt a védett tartalom!<br /><br />\n";
print "<a href=\"clogout.php\">Kilépés</a>\n";
print "</font>";
print "</body>\n";
print "</html>\n";
}
?>
Annak érdekében, hogy a beléptetést bárki le tudja ellenőrizni, szükség van egy felhasználói név – jelszó párra: Gipsz Jakab felhasználónak a bejelentkező (login) neve és jelszava is gjakab, azaz a Felhasználók felvétele lapon rendszergazdaként rögzített képzeletbeli személy. Ha ezt írjuk a login név és jelszó beviteli mezőjébe, az ellenőrző kódhoz pedig a CAPTCHA képen látható kódot, akkor bejuthatunk a védett területre. Belépés után a következő képet látjuk.
A Kilépésen kattintva a clogout.php script fut le, mellyel újra a belépési felületre jutunk. A script listája:
http://gorbem.hu/PH/clogout.php
<?php
session_start();
include "hconfig.php";
unset($_SESSION['nlogin']);
session_destroy();
header("location:
cindex.php");
?>