Compzone.Org – PHP, MySQL, kurs, skrypty, porady

Autoryzacja kodem z obrazka w PHP

Artykuł ten jest wpisem archiwalnym, został napisany dawno temu i może zawierać błędy lub całkowicie nie działać w dzisiejszych środowiskach produkcyjnych i testowych. Dlatego zalecamy używanie pokazanych tu przykładów jedynie w celach edukacyjnych.

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. Wprowadzenie tego zabezpieczenia nie pozwoli masowo zakładać konta przez BOTy w naszym serwisie.

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

<?php
//rozpoczynamy sesję
session_start();

//definiujemy czcionki za pomocą tablicy
$czcionki= array('times.ttf','trebuc.ttf', 'arialbd.ttf','GARAIT.TTF','comic.ttf');

//ustawiamy nagłówek HTTP na obrazek png
header("Content-type: image/png");

//tworzymy obrazek o wysokości 40 i szerokości 250
$obraz = ImageCreate(250, 40);

//definiujemy kolor 1 (biały)
$kolor['1'] = ImageColorAllocate($obraz, 255, 255, 255);

//definiujemy kolor 2 (darkgray)
$kolor['2'] = ImageColorAllocate($obraz, 169, 169, 169);

//definiujemy kolor 3 (gainsboro) 
$kolor['3'] = ImageColorAllocate($obraz, 220, 220, 220);

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
{
	//tworzymy losowo rozmieszczone elipsy o kolorze darkgray
	imageellipse($obraz, rand(0, 250), rand(0, 40), rand(2, 30), rand(2, 30), $kolor['2']);
}

for($i = 0; $i < 3; $i++)
{
	//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['3'], $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
ImageTTFText($obraz, rand(25,30), 0, rand(25,30), rand(30,35), $kolor['2'], $czcionki[rand(0, count($czcionki) - 1)], $_SESSION['obst']); 

//wyświetlamy obrazek za pomocą funkcji imagepng()
imagepng($obraz);

//niszczymy identyfikator pliku
ImageDestroy($obraz);

//zwalniamy z sesji obst
session_unregister('obst');
?>

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).

„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.”

„Engine” naszego systemu jest gotowy. Zajmiemy się teraz tworzeniem strony, na którym użytkownik będzie spisywał hasło z obrazka. Plik autoryzacja.php

<?php
//losujemy liczbę od 0 do 100000000 i przypisujemy ją do zmiennej obst
$obst = rand(0, 100000000);

//uruchamiamy sesję
session_start();

//dla sesji rejestrujemy obst
session_register('obst');

//przypisanie zawartości zmiennej obst do obst
$_SESSION['obst']=$obst;

//generujemy 32-bitowy token zawartości zmiennej obst
// za pomocą algorytmu md5 i przypisujemy go do zmiennej sprawdz
$sprawdz = md5(md5($obst));
$_SESSION['sprawdz']=$sprawdz;
?>

Kod formularza:


<img src="obraz.php">
<form action="http://www.compzone.org/raz.php" method="post">
Tutaj przepisz kod z obrazka: <input type="text" name="ID"><br>
<input name="sprawdz" value="<?php echo $sprawdz ?>" type="hidden"><br>
<input type="submit" value="Sprawdź">

Ż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.

Plik raz.php

<?php
session_start();

//generujemy 32-bitowy token zawartości zmiennej ID
//przesłanej z formularza autoryzacja.php i przypisujemy do zmiennej kod
$kod = md5(md5($ID));

//sprawdzamy czy kod się zgadza
if ($kod==$sprawdz)
{
	//jeżeli tak wyświetlamy stosowną informację
	echo "hasło poprawne";
}
else //jeżeli nie
{
	//wyświetlamy stosowną informację
	echo "hasło niepoprawne";
}

//usuwamy z sesji wartość sprawdz
session_unregister('sprawdz');
?>

Tutaj również nie ma ż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ę.

Leave a Comment

Your email address will not be published. Required fields are bold.


osiem × = 32