CMYK
P
odczas wysy³ania SMS-ów z bramki internetowej, czy przy
sprawdzaniu wolnych domen trzeba przepisaæ kod z grafiki do pola
formularza. Powodem tego s¹ nadu¿ycia, które pojawi³y siê wraz
z popularnoœci¹ bezp³atnych us³ug. Przyk³adem jest bramka jednego
z rodzimych operatorów sieci komórkowych. Umo¿liwia³a ona bezp³atne
wysy³anie wiadomoœci SMS na telefony komórkowe z poziomu strony
internetowej operatora. Us³uga bardzo atrakcyjna. Nie doœæ, ¿e SMS-y
z Internetu s¹ bezp³atne, to (ze wzglêdu na klawiaturê komputerow¹)
znacznie wygodniej i szybciej siê je pisze. Wys³anie SMS-a sprowadza siê do
wpisania w³asnego numeru, treœci wiadomoœci i wciœniêcia przycisku Wyœlij.
Taki mechanizm by³ bardzo wygodny, lecz stwarza³ pole do nadu¿yæ. Bez
wiêkszej znajomoœci któregoœ z jêzyków skryptowych (choæby PHP) mo¿na
by³o automatycznie, czyli bez ingerencji cz³owieka, rozsy³aæ wiadomoœci.
W ten sposób zrodzi³a siê grupa spamerów, którzy na bezp³atnych bramkach
SMS chcieli zarobiæ. Sieci komórkowe chc¹ natomiast wypracowywaæ zysk,
wiêc nie na rêkê by³ im bezp³atny ³¹cznik miêdzy Internetem a komórk¹.
Wprowadzono zatem obrazki zabezpieczaj¹ce (ang. security images),
które blokuj¹ roboty-automaty. Z puli kodów-hase³ losowo wybierany jest
jeden i umieszczany na grafice. Tak przygotowany obrazek trafia na stronê,
by zabezpieczyæ j¹ przed automatami. Cz³owiekowi przepisanie kodu
z obrazka do dodatkowego pola nie sprawia ¿adnego problemu. Przerasta to
jednak mo¿liwoœci komputera, poniewa¿ obraz jest dla niego wy³¹cznie
zbiorem ró¿nokolorowych pikseli. Oczywiœcie mo¿liwe jest wyodrêbnienie
z obrazu tekstu przy u¿yciu programów typu OCR (rozpoznaj¹cego tekst
z obrazu), ale tylko wówczas, gdy ró¿nica kontrastu pomiêdzy has³em
a t³em bêdzie du¿a ró¿nica. Gdy ta ró¿nica jest niewielka, OCR twierdzi,
¿e strona jest pusta (nie zawiera ¿adnego tekstu).
Operator sieci komórkowych IDEA wykorzystuje obrazki
zabezpieczaj¹ce do ochrony bramki SMS
Operator domen narodowych NASK broni obrazkami zabezpieczaj¹cymi
formularz do sprawdzania wolnych domen oraz us³ugi WhoIs
Portal onet.pl broni swoj¹ wyszukiwarkê przed automatami rejestruj¹cymi
Co będzie potrzebne?
Aby stworzyæ system do zabezpieczania us³ug przy u¿yciu obrazów,
wykorzystamy narzêdzia ogólnie dostêpne na serwerze. Bêdzie potrzebna
obs³uga jêzyka PHP z zainstalowan¹ bibliotek¹ GD (+FreeType) oraz
dostêp do MySQL. Nie ma specjalnych wymagañ co do wersji biblioteki
GD – najlepiej >2.0. Bêdziemy korzystaæ z formatu PNG, lecz mo¿na go
zast¹piæ GIF-em. Baza danych MySQL bêdzie nam potrzebna do
PHP
INTERNET.marzec.2005104
NA CD NEWSY Z OK£ADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
Ochronausługprzyużyciuobrazkówzabezpieczających
Czasy, w których za pomoc¹ jednego formularza mo¿na by³o zarejestrowaæ stronê
we wszystkich katalogach i wyszukiwarkach bezpowrotnie przeminê³y.
Wszystkiemu winne s¹ niepozorne obrazki zabezpieczaj¹ce, które zmuszaj¹ u¿ytkownika
do przepisania ukrytych w nich hase³.
Pawe³ Grzesiak
SKUTECZNY SPOSÓB
NA ROBOTY INTERNETOWE
Wszystkie przykłady zaprezentowane w tym artykule
zostały zamieszczone na dołączonej płycie CD
w katalogu Warsztat_PHP.
CMYK
przechowywania hase³, które trafi¹ póŸniej na obrazki. Stworzymy w niej
tylko jedn¹ tabelê. Bêdzie sk³ada³a siê z 5000 rekordów, czyli 5000
ró¿nych kodów, a jej rozmiar to ok. 0,5 MB.
Jak to działa?
Napiszemy trzy skrypty: instalacyjny – pozwoli na stworzenie
odpowiedniej tabeli i wygenerowanie hase³ do obrazków; graficzny
– na poczekaniu wygeneruje odpowiedni obrazek; steruj¹cy – bêdzie
zawiera³ formularz z naszym obrazkiem zabezpieczaj¹cym. Je¿eli do
formularza zostanie poprawnie wpisane has³o, skrypt wyœwietli
podziêkowanie. Je¿eli Ÿle, wyœwietli komunikat o b³êdnym haœle.
Tak wygl¹da gotowy mechanizm do zabezpieczenia obrazów
Baza danych
Rozpoczynamy od stworzenia tabeli do przechowywania wszystkich
hase³. Bêdzie ona sk³ada³a siê z dwóch pól:
„hash”, pole – g³ówny klucz tabeli, typu varchar, 32 znaki, jest to
has³o zakodowane algorytmem szyfruj¹cym MD5,
„code”, pole – unikalne, typu varchar, 6 znaków, jest to has³o,
które uka¿e siê na obrazku.
W postaci SQL, kod potrzebny do utworzenia tabeli bêdzie
wygl¹da³ nastêpuj¹co:
CREATE TABLE mi_secimg (
hash VARCHAR(32) NOT NULL,
code VARCHAR(6) NOT NULL,
PRIMARY KEY (hash),
UNIQUE (code)
);
Za³o¿yliœmy, ¿e has³o na obrazku bêdzie sk³ada³o siê z 6 znaków. Tê
liczbê mo¿na oczywiœcie rozszerzyæ. Zakodowane has³o jest potrzebne
poniewa¿ mamy dwa skrypty: steruj¹cy i generuj¹cy obrazek. Skrypt
generuj¹cy obrazek musi wiedzieæ, które has³o ma umieœciæ na obrazku,
a skrypt steruj¹cy musi wiedzieæ, czy wpisany przez u¿ytkownika kod jest
prawid³owy. W tym celu potrzebna jest baza danych. Je¿eli nie chcemy
u¿ywaæ bazy, bo nie mamy do niej dostêpu, mo¿na zast¹piæ j¹ baz¹
danych opart¹ o pliki tekstowe. To jednak mniej wygodne rozwi¹zanie,
dlatego w artykule korzystamy z bazy danych.
Wiemy ju¿ jak ma wygl¹daæ tabela. Napiszemy wiêc skrypt
instalacyjny, który ma za zadanie:
po³¹czyæ siê z baz¹ danych,
utworzyæ tabelê mi_secimg,
wygenerowaæ losowo kody 6-znakowe w iloœci 5000 i ich
zakodowane odpowiedniki,
wprowadziæ wygenerowane kody do bazy danych.
Skrypt rozpoczynamy od zmiennych odpowiedzialnych za
konfiguracjê:W œrodkowej pêtli „for” tworzy siê has³o. Pêtla zostanie
wykonana tyle¿ razy, ile jest znaków w haœle. Za ka¿dym razem
zostanie wygenerowany w niej jeden znak. Za wygenerowanie
losowego znaku odpowiedzialna jest funkcja rand(). Wybiera ona
losowo liczbê z przedzia³u 0 do (liczba znaków w tablicy) 1. W ten
sposób wylosowany znak trafia do zmiennej $code, która z ka¿d¹
iteracj¹ poszerza siê o jeden znak, by osi¹gn¹æ wartoœæ 6 znaków
($p<$codeLenght). Gdy kod zostanie wygenerowany, nastêpuje
dodanie go do bazy. Poniewa¿ w zmiennej $code kryje siê has³o,
mo¿na ³atwo je przekazaæ do zapytania, koduj¹c drugie pole
algorytmem MD5 przy u¿yciu funkcji md5(). Du¿a pêtla zatacza
ko³o kolejny raz i resetuje has³o (zmienn¹ $code), a¿ do wyczerpania
puli 5000 hase³.
PHP
INTERNET.marzec.2005 105
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OK£ADKI NEWSY NA CD
CMYK
Skrypt sterujący
Skrypt instalacyjny nie bêdzie ju¿ potrzebny. Zaraz po jego wykonaniu
mo¿na go usun¹æ z serwera. Teraz przysz³a pora na utworzenie
skryptu, który bêdzie odpowiedzialny za pracê ca³ego mechanizmu.
Przyk³adowy skrypt bêdzie zabezpiecza³ us³ugê „dodawania strony
internetowej do katalogu”. Ze wzglêdu na oszczêdnoœæ miejsca ca³y
formularz bêdzie sk³ada³ siê jedynie z pola do wprowadzenia adresu
strony oraz pola do przepisania has³a z obrazka.
Zadania skryptu:
po³¹czyæ z baz¹ danych,
wybraæ losowo has³o, które znajdzie siê na obrazku,
wyœwietliæ formularz z obrazkiem wraz z ukrytym polem
zawieraj¹cym zakodowane has³o,
sprawdziæ, czy formularz zosta³ wys³any (je¿eli tak – sprawdziæ,
czy has³o jest poprawne),
wyœwietliæ podziêkowanie i dodaæ stronê do kolejki
oczekuj¹cych na dodanie lub wyœwietliæ informacje
o b³êdnym haœle.
Zaczniemy od po³¹czenia z baz¹ i utworzenia podstawowego kodu
witryny:
Zabezpieczona obrazkiem us³ugaTeraz stworzymy formularz, który bêdzie pozwala³ na dodawanie
nowych stron do katalogu witryny xyz. Bêdzie on sk³ada³ siê z pola do
wpisywania adresu, obrazka, pola do wpisywania kodu z obrazka oraz
ukrytego pola kryj¹cego „hash”, czyli zakodowane has³o.W powy¿szym kodzie wykorzystujemy wielokrotnie hash, który
jest zakodowanym has³em z brakiem mo¿liwoœci odzyskania. Pierwsz¹
czynnoœci¹ jest pobranie z bazy danych losowego rekordu. Odbywa siê
to poprzez uporz¹dkowanie elementów tabeli mi_secimg w sposób
losowy, a nastêpnie pobranie jednego rekordu. Wynikiem zapytania
jest nasz losowy hash. W tym momencie nie wiemy oczywiœcie jak
brzmi kod. Hash przekazujemy do naszego obrazka. Skrypt o nazwie
image.php odpowiada bowiem za generowanie obrazu. Jako parametr
podajemy mu hash, czyli nasze zakodowane has³o. Gdybyœmy w tym
miejscu przes³ali rzeczywisty kod, nie mielibyœmy ju¿ do czynienia
z zabezpieczeniem. I tu jest odpowiedŸ na pytanie, po co to
zakodowane has³o. Warto zauwa¿yæ, ¿e nasz hash trafia równie¿ do
ukrytego pola. Oznacza to, ¿e po wys³aniu formularza nie stracimy tej
zmiennej, bêdziemy mogli j¹ póŸniej odczytaæ z tablicy
$_POST[”hash”]. W ten sposób bêdziemy w stanie sprawdziæ, czy
has³o, które poda³ u¿ytkownik, jest zgodne z has³em, które jest
przydzielone do tego hasha. ¯eby zamieniæ hash na normalne has³o,
bêdziemy musieli wykonaæ jedno zapytanie. Pobierze ono rekord,
który zawiera w³aœnie ten hash. Wtedy oba has³a zostan¹ porównane
– to wprowadzone przez u¿ytkownika i to pobrane z bazy danych.
Zobaczymy, jak to prezentuje siê w praktyce:Pierwsza linia mo¿e nieco przyt³aczaæ tych, którzy maj¹ ma³o do
czynienia z wyra¿eniami regularnymi. Funkcja ereg() zwraca prawdê,
je¿eli element tablicy $_POST[’hash’] spe³nia szablon ”[a-z0-9]{32}”.
Oznacza to, ¿e ten element tablicy ma siê sk³adaæ z dok³adnie
32 znaków. Ka¿dy z tych znaków mo¿e przyj¹æ wartoœæ od a do z i od
0 do 9. Ma³pa przed ca³¹ funkcj¹ jest po to, by funkcja nie zwraca³a
b³êdu. Ma to miejsce wtedy, gdy wprowadzamy dane do formularza.
Wtedy ¿adne dane nie znajduj¹ siê w zmiennej $_POST[’hash’]
i ereg() zwraca³oby b³¹d.
Instrukcja warunkowa „if” sprawdza czy kody s¹ zgodne ze sob¹.
Je¿eli nie, to wyœwietla b³¹d i prosi u¿ytkownika o ponowne wpisanie
kodu. W takim przypadku skrypt powinien „pamiêtaæ” adres URL,
który u¿ytkownik wprowadzi³. Ten niestety nie ma na tyle
rozbudowanej obs³ugi b³êdów. Je¿eli oba kody s¹ ze sob¹ zgodne,
skrypt wyœwietla podziêkowania. W tym momencie nale¿a³oby
równie¿ wykonaæ czynnoœci zwi¹zane z dodawaniem strony do
katalogu. Najprawdopodobniej podany przez u¿ytkownika adres
zosta³by zapisany do jakiejœ bazy danych, by móg³ siê nim zaj¹æ
redaktor odpowiedzialny za dodanie strony do wyszukiwarki.
Generowanie obrazka
W tej chwili skrypt image.php jest jak czarna skrzynka. Wiemy tylko,
¿e tworzy obraz na podstawie hashu dostarczanego w postaci
parametru.
Wygl¹d gotowego
obrazka
zabezpieczaj¹cego
Skrypt powinien:
po³¹czyæ siê z baz¹ danych,
sprawdziæ, czy zosta³ podany jako parametr hash,
pobraæ has³o z bazy danych, maj¹c do dyspozycji hash,
sprawdziæ, czy has³o jest poprawnej d³ugoœci
(ktoœ móg³ spróbowaæ podaæ nieprawid³owy hash),
rozpocz¹æ tworzenie obrazka poprzez wstawienie t³a,
utworzyæ napis na obrazku, czyli nasz kod,
wyœwietliæ gotowy obrazek u¿ytkownikowi.
PHP
INTERNET.marzec.2005106
NA CD NEWSY Z OK£ADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
CMYK P odczas wysy³ania SMS-ów z bramki internetowej, czy przy sprawdzaniu wolnych domen trzeba przepisaæ kod z grafiki do pola formularza. Powodem tego s¹ nadu¿ycia, które pojawi³y siê wraz z popularnoœci¹ bezp³atnych us³ug. Przyk³adem jest bramka jednego z rodzimych operatorów sieci komórkowych. Umo¿liwia³a ona bezp³atne wysy³anie wiadomoœci SMS na telefony komórkowe z poziomu strony internetowej operatora. Us³uga bardzo atrakcyjna. Nie doœæ, ¿e SMS-y z Internetu s¹ bezp³atne, to (ze wzglêdu na klawiaturê komputerow¹) znacznie wygodniej i szybciej siê je pisze. Wys³anie SMS-a sprowadza siê do wpisania w³asnego numeru, treœci wiadomoœci i wciœniêcia przycisku Wyœlij. Taki mechanizm by³ bardzo wygodny, lecz stwarza³ pole do nadu¿yæ. Bez wiêkszej znajomoœci któregoœ z jêzyków skryptowych (choæby PHP) mo¿na by³o automatycznie, czyli bez ingerencji cz³owieka, rozsy³aæ wiadomoœci. W ten sposób zrodzi³a siê grupa spamerów, którzy na bezp³atnych bramkach SMS chcieli zarobiæ. Sieci komórkowe chc¹ natomiast wypracowywaæ zysk, wiêc nie na rêkê by³ im bezp³atny ³¹cznik miêdzy Internetem a komórk¹. Wprowadzono zatem obrazki zabezpieczaj¹ce (ang. security images), które blokuj¹ roboty-automaty. Z puli kodów-hase³ losowo wybierany jest jeden i umieszczany na grafice. Tak przygotowany obrazek trafia na stronê, by zabezpieczyæ j¹ przed automatami. Cz³owiekowi przepisanie kodu z obrazka do dodatkowego pola nie sprawia ¿adnego problemu. Przerasta to jednak mo¿liwoœci komputera, poniewa¿ obraz jest dla niego wy³¹cznie zbiorem ró¿nokolorowych pikseli. Oczywiœcie mo¿liwe jest wyodrêbnienie z obrazu tekstu przy u¿yciu programów typu OCR (rozpoznaj¹cego tekst z obrazu), ale tylko wówczas, gdy ró¿nica kontrastu pomiêdzy has³em a t³em bêdzie du¿a ró¿nica. Gdy ta ró¿nica jest niewielka, OCR twierdzi, ¿e strona jest pusta (nie zawiera ¿adnego tekstu). Operator sieci komórkowych IDEA wykorzystuje obrazki zabezpieczaj¹ce do ochrony bramki SMS Operator domen narodowych NASK broni obrazkami zabezpieczaj¹cymi formularz do sprawdzania wolnych domen oraz us³ugi WhoIs Portal onet.pl broni swoj¹ wyszukiwarkê przed automatami rejestruj¹cymi Co będzie potrzebne? Aby stworzyæ system do zabezpieczania us³ug przy u¿yciu obrazów, wykorzystamy narzêdzia ogólnie dostêpne na serwerze. Bêdzie potrzebna obs³uga jêzyka PHP z zainstalowan¹ bibliotek¹ GD (+FreeType) oraz dostêp do MySQL. Nie ma specjalnych wymagañ co do wersji biblioteki GD – najlepiej >2.0. Bêdziemy korzystaæ z formatu PNG, lecz mo¿na go zast¹piæ GIF-em. Baza danych MySQL bêdzie nam potrzebna do PHP INTERNET.marzec.2005104 NA CD NEWSY Z OK£ADKI FIRMA MAGAZYN PROGRAMY WARSZTAT Ochronausługprzyużyciuobrazkówzabezpieczających Czasy, w których za pomoc¹ jednego formularza mo¿na by³o zarejestrowaæ stronê we wszystkich katalogach i wyszukiwarkach bezpowrotnie przeminê³y. Wszystkiemu winne s¹ niepozorne obrazki zabezpieczaj¹ce, które zmuszaj¹ u¿ytkownika do przepisania ukrytych w nich hase³. Pawe³ Grzesiak SKUTECZNY SPOSÓB NA ROBOTY INTERNETOWE Wszystkie przykłady zaprezentowane w tym artykule zostały zamieszczone na dołączonej płycie CD w katalogu Warsztat_PHP.
CMYK przechowywania hase³, które trafi¹ póŸniej na obrazki. Stworzymy w niej tylko jedn¹ tabelê. Bêdzie sk³ada³a siê z 5000 rekordów, czyli 5000 ró¿nych kodów, a jej rozmiar to ok. 0,5 MB. Jak to działa? Napiszemy trzy skrypty: instalacyjny – pozwoli na stworzenie odpowiedniej tabeli i wygenerowanie hase³ do obrazków; graficzny – na poczekaniu wygeneruje odpowiedni obrazek; steruj¹cy – bêdzie zawiera³ formularz z naszym obrazkiem zabezpieczaj¹cym. Je¿eli do formularza zostanie poprawnie wpisane has³o, skrypt wyœwietli podziêkowanie. Je¿eli Ÿle, wyœwietli komunikat o b³êdnym haœle. Tak wygl¹da gotowy mechanizm do zabezpieczenia obrazów Baza danych Rozpoczynamy od stworzenia tabeli do przechowywania wszystkich hase³. Bêdzie ona sk³ada³a siê z dwóch pól: „hash”, pole – g³ówny klucz tabeli, typu varchar, 32 znaki, jest to has³o zakodowane algorytmem szyfruj¹cym MD5, „code”, pole – unikalne, typu varchar, 6 znaków, jest to has³o, które uka¿e siê na obrazku. W postaci SQL, kod potrzebny do utworzenia tabeli bêdzie wygl¹da³ nastêpuj¹co: CREATE TABLE mi_secimg ( hash VARCHAR(32) NOT NULL, code VARCHAR(6) NOT NULL, PRIMARY KEY (hash), UNIQUE (code) ); Za³o¿yliœmy, ¿e has³o na obrazku bêdzie sk³ada³o siê z 6 znaków. Tê liczbê mo¿na oczywiœcie rozszerzyæ. Zakodowane has³o jest potrzebne poniewa¿ mamy dwa skrypty: steruj¹cy i generuj¹cy obrazek. Skrypt generuj¹cy obrazek musi wiedzieæ, które has³o ma umieœciæ na obrazku, a skrypt steruj¹cy musi wiedzieæ, czy wpisany przez u¿ytkownika kod jest prawid³owy. W tym celu potrzebna jest baza danych. Je¿eli nie chcemy u¿ywaæ bazy, bo nie mamy do niej dostêpu, mo¿na zast¹piæ j¹ baz¹ danych opart¹ o pliki tekstowe. To jednak mniej wygodne rozwi¹zanie, dlatego w artykule korzystamy z bazy danych. Wiemy ju¿ jak ma wygl¹daæ tabela. Napiszemy wiêc skrypt instalacyjny, który ma za zadanie: po³¹czyæ siê z baz¹ danych, utworzyæ tabelê mi_secimg, wygenerowaæ losowo kody 6-znakowe w iloœci 5000 i ich zakodowane odpowiedniki, wprowadziæ wygenerowane kody do bazy danych. Skrypt rozpoczynamy od zmiennych odpowiedzialnych za konfiguracjê:W œrodkowej pêtli „for” tworzy siê has³o. Pêtla zostanie wykonana tyle¿ razy, ile jest znaków w haœle. Za ka¿dym razem zostanie wygenerowany w niej jeden znak. Za wygenerowanie losowego znaku odpowiedzialna jest funkcja rand(). Wybiera ona losowo liczbê z przedzia³u 0 do (liczba znaków w tablicy) 1. W ten sposób wylosowany znak trafia do zmiennej $code, która z ka¿d¹ iteracj¹ poszerza siê o jeden znak, by osi¹gn¹æ wartoœæ 6 znaków ($p<$codeLenght). Gdy kod zostanie wygenerowany, nastêpuje dodanie go do bazy. Poniewa¿ w zmiennej $code kryje siê has³o, mo¿na ³atwo je przekazaæ do zapytania, koduj¹c drugie pole algorytmem MD5 przy u¿yciu funkcji md5(). Du¿a pêtla zatacza ko³o kolejny raz i resetuje has³o (zmienn¹ $code), a¿ do wyczerpania puli 5000 hase³. PHP INTERNET.marzec.2005 105 WARSZTAT PROGRAMY MAGAZYN FIRMA Z OK£ADKI NEWSY NA CD
CMYK Skrypt sterujący Skrypt instalacyjny nie bêdzie ju¿ potrzebny. Zaraz po jego wykonaniu mo¿na go usun¹æ z serwera. Teraz przysz³a pora na utworzenie skryptu, który bêdzie odpowiedzialny za pracê ca³ego mechanizmu. Przyk³adowy skrypt bêdzie zabezpiecza³ us³ugê „dodawania strony internetowej do katalogu”. Ze wzglêdu na oszczêdnoœæ miejsca ca³y formularz bêdzie sk³ada³ siê jedynie z pola do wprowadzenia adresu strony oraz pola do przepisania has³a z obrazka. Zadania skryptu: po³¹czyæ z baz¹ danych, wybraæ losowo has³o, które znajdzie siê na obrazku, wyœwietliæ formularz z obrazkiem wraz z ukrytym polem zawieraj¹cym zakodowane has³o, sprawdziæ, czy formularz zosta³ wys³any (je¿eli tak – sprawdziæ, czy has³o jest poprawne), wyœwietliæ podziêkowanie i dodaæ stronê do kolejki oczekuj¹cych na dodanie lub wyœwietliæ informacje o b³êdnym haœle. Zaczniemy od po³¹czenia z baz¹ i utworzenia podstawowego kodu witryny:
Konfiguracja skryptu: