http://gorbem.hu/PHP.php

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ő:

 

http://gorbem.hu/PH/ct.php

           

<?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" />&nbsp;

<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");

?>