CompZone.Org :: Artykuły :: PHP
Jaki jest Twój wiek?
40 - 59
26 - 39
19 - 25
13 - 18
12 i mniej
60 i więcej
Sonda Wyniki

Add to Google

Autoryzacja kodem z obrazka w PHP

Wprowadzenie tego zabezpieczenia nie pozwoli masowo zakładać konta przez BOTy w naszym serwisie.

Wstęp

Każdy z was pewnie zastanawiał się jak rozwiązać masowe zakładanie kont przez roboty w Waszym serwisie. I oto przychodzi rozwiązanie: wystarczy zrobić dynamicznie generowany obrazek z losowym hasłem. A jak go wykonać przedstawię poniżej. Będziemy tutaj korzystali z biblioteki GD. Przed przystąpieniem do lektury polecam zapoznanie się z artykułem Dynamiczny Avatar.

Zaczynamy !

Na początku zaczniemy od skryptu, który stworzy dla nas obrazek.

obrazek.php:

  
<?php
session_start(); //rozpoczynamy sesję
$
czcionki= array('times.ttf','trebuc.ttf', 'arialbd.ttf','GARAIT.TTF','comic.ttf'); //definiujemy czcionki za pomocą tablicy
header("Content-type: image/png"); //ustawiamy nagłówek HTTP na obrazek png
$
obraz = ImageCreate(250, 40); //tworzymy obrazek o wysokości 40 i szerokości 250
$
kolor['1'] = ImageColorAllocate($obraz, 255, 255, 255); //definiujemy kolor 1 (biały)
$
kolor['2'] = ImageColorAllocate($obraz, 169, 169, 169); //definiujemy kolor 2 (darkgray)
$
kolor['3'] = ImageColorAllocate($obraz, 220, 220, 220); //definiujemy kolor 3 (gainsboro)
ImageFilledRectangle($obraz, 0, 0, 300, 50, $kolor['1']);
ImageFilledArc($obraz, 25, 25, 40, 40, 180, 360, $kolor['3'], 1);
for($i = 0; $i < 60; $i++) //w pętli
{
imageellipse($obraz, rand(0, 250), rand(0, 40), rand(2, 30), rand(2, 30), $kolor['2']); //tworzymy losowo rozmieszczone elipsy o kolorze darkgray
}
for($i = 0; $i < 3; $i++)
{
ImageTTFText($obraz, rand(25,30), 0, rand(25,30), rand(30,35), $kolor['3'], $czcionki[rand(0, count($czcionki) - 1)], $_SESSION['obst']); //dodajemy do rysunku tekst o losowym położeniu, kolorze gainsboro, losowej czcionce (losowanej z tablicy)
}
ImageTTFText($obraz, rand(25,30), 0, rand(25,30), rand(30,35), $kolor['2'], $czcionki[rand(0, count($czcionki) - 1)], $_SESSION['obst']); //dodajemy do rysunku tekst o losowym położeniu, kolorze darkgray, losowej czcionce (losowanej z tablicy) oraz tekście, który przekażemy za pomocą sesji

Imagepng($obraz); //wyświetlamy obrazek za pomocą funkcji <a href="manualphp-ImagePNG.html">ImagePNG</a>
ImageDestroy($obraz); //niszczymy identyfikator pliku
session_unregister('obst'); //zwalniamy z sesji obst
?>

WAŻNE!!! Aby skrypt zechciał działać wszystkie czcionki zadeklarowane w tablicy $czcionki (np. GARAIT.TTF) należy wgrać uprzednio na serwer. Powyższy kod tworzy nowy obrazek PNG, na którym zauważyć będzie można losowo tworzone elipsy za pomocą funkcji ImageEllipse oraz tekst-hasło (ale o tym później). W powyższym kodzie zmienna $obraz staje się jednocześnie identyfikatorem obrazka. Za pomocą funkcji ImageColorAllocate ustalamy kolory których będziemy używać. Funkcja ta pobiera 4 parametry, identyfikator obrazka, oraz wartości składników RGB. Funkcja ImageTTFText tworzy tekst przy użyciu czcionki typu TrueType. Pobiera ona jako parametry: identyfikator, wielkość czcionki, ewentualne obrócenie tekstu o określony kąt,współrzędną x, współrzędną y, kolor tekstu, plik z czcionką, którą chcemy użyć oraz tekst, który chcemy wypisać (w naszym wypadku będą to losowe wartości).

Cytat:

"Godne zapamiętania jest to, że współrzędne obrazka rozpoczynają się od lewego górnego rogu który posiada współrzędne x=0 i y=0. Lewy dolny róg obrazka x=szerokość, y=wysokość. Należy o tym pamiętać, gdyż są to zasady odwrotne niż typowe konwencje graficzne."

Dobrze. "Engine" naszego systemu jest gotowy ;) Zajmiemy się teraz tworzeniem strony, na którym użytkownik będzie spisywał hasło z obrazka.

autoryzacja.php:

  
<?php
$
obst = rand(0, 100000000); //losujemy liczbę od 0 do 100000000 i przypisujemy ją do zmiennej obst
session_start(); //uruchamiamy sesję
session_register('obst'); //dla sesji rejestrujemy obst
$
_SESSION['obst']=$obst; //przypisanie zawartości zmiennej obst do obst
$
sprawdz = md5(md5($obst)); //generujemy 32-bitowy token zawartości zmiennej obst za pomocą algorytmu md5 i przypisujemy go do zmiennej sprawdz
$
_SESSION['sprawdz']=$sprawdz;
?>
<img src="obraz.php"> //wyświetlamy obrazek z kodem
<FORM action="http://www.compzone.livenet.pl/test/raz.php" Method="post">
Tutaj przepisz kod z obrazka:
<INPUT NAME="ID"><br>
<input name="sprawdz" value="<?php echo $sprawdz ?>" type="hidden">
<br>
<INPUT TYPE="submit" VALUE="Sprawdz">

Żadnych cudów tutaj nie widzimy. Po prostu losujemy tutaj liczbę za pomocą funkcji rand i za pomocą sesji przesyłamy ją do obraz.php (zmienna obst). Wytworzymy też za pomocą algorytmu md5 unikalny token tekstu z obrazka (będziemy go przekazywać za pomocą sesji). Teraz zajmiemy się stroną, która sprawdzi czy wpisaliśmy poprawny kod.

raz.php:

  
<?php
session_start();
$
kod = md5(md5($ID)); //generujemy 32-bitowy token zawartości zmiennej ID przesłanej z formularza autoryzacja.php i przypisujemy do zmiennej kod
if ($kod==$sprawdz) //sprawdzamy czy kod się zgadza
{
echo "hasło poprawne"; //jeżeli tak wyświetlamy stosowną informację
}
else //jeżeli nie
{
echo "hasło niepoprawne"; //wyświetlamy stosowną informację
}
session_unregister('sprawdz'); //usuwamy z sesji wartość sprawdz
?>

Tutaj również żadnych cudów. Po prostu generujemy token tekstu, który wpisał użytkownik i sprawdzamy go z tokenem wygenerowanym z tekstu z obrazka i jeżeli wszystko się zgadza wyświetlamy stosowną informację.

Gall Anonim @ 10-07-2006 17:09

#1

zauwazylem ze w artykule jest pewna niescislosc. otoz nad kodem skryptu generujacego obrazek jest "obrazek.php" natomiast w autoryzacja.php jest odnosnik do "obraz.php" jako ze jestem poczatkujacy niewiem czy tak powinno byc ale w raz.php w zaleznosci od ustawien serwera powinny sie znalezc $_post[zmienna ]

pluciorx @ 08-09-2007 14:58

#2

zauwazylem ze w artykule jest pewna niescislosc. otoz nad kodem skryptu generujacego obrazek jest "obrazek.php" natomiast w autoryzacja.php jest odnosnik do "obraz.php" jako ze jestem poczatkujacy niewiem czy tak powinno byc ale w raz.php w zaleznosci od ustawien serwera powinny sie znalezc $_post[zmienna ]

pluciorx @ 08-09-2007 15:26
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!