2008 06 Test CAPTCHA


POCZTKI
SAAWOMIR ORAOWSKI
Test CAPTCHA
Stopień trudności
Jak odróżnić człowieka od automatu w Internecie? Istnieje prosty
test, który może to sprawdzić. Wystarczy wygenerować obrazek
ze zniekształconym tekstem i kazać użytkownikowi go odczytać.
odczas wypełniania różnorodnych formularzy rozwiązanie polega na użyciu podstawionych stron
na stronach WWW bardzo często musimy  najlepiej pornograficznych. Jeśli użytkownik takiego
Pudowodnić, że nie jesteśmy botami. Zwykle serwisu WWW zechce obejrzeć jakąś jego część
służą do tego specjalnie spreparowane obrazki, z (zdjęcie), musi wpisać kod z obrazka. Wystarczy, że
których przeciętny człowiek powinien bez problemu obrazek zabezpieczający do takiej strony zostanie
odczytać nieco zniekształcony tekst (Rysunek 1). wklejony z formularza znajdującego się na stronie,
Taki rodzaj zabezpieczeń przydaje się którą chcemy zaatakować. Nieświadomy użytkownik
szczególnie przy różnego rodzaju rejestracjach, sam rozwiąże za nas zagadkę. Jest to kolejny rodzaj
np. darmowych kont e-mail, lub wypowiedziach ataku, w którym wykorzystujemy człowieka. Sprytne,
na forach internetowych. Chroni on przed bardziej efektywne, tańsze  ale czy wystarczająco
automatycznym tworzeniem kont przez automaty skuteczne? Ludzie odpowiedzialni za projekt
(np. roboty spamerskie). Technika ta nosi nazwę CAPTCHA twierdzą, że nie. Spamerzy twierdzą
CAPTCHA, co jest skrótem angielskiego określenia oczywiście, że tak. Jednak proszę sobie wyobrazić
Completely Automated Public Turing Test to Tell serwis WWW, w którym za każdym razem, kiedy
Computers and Humans Apart. Luis von Ahn, chcemy zobaczyć coś nowego, musimy wpisywać
Manuel Blum, Nicholas Hopper i John Langford z jakiś kod. Wątpię, żeby taka strona przyciągała
Carnegie Mellon University stworzyli ją na potrzeby wielu użytkowników. Lepszym rozwiązaniem są
Yahoo. Chcieli w ten sposób ukrócić automatyczne programy OCR (ang. Optical Character Recognition),
tworzenie spamerskich kont e-mail na tym portalu. które za pomocą pewnych algorytmów potrafią
Z ARTYKUAU
Na początku CAPTCHA sprawdzała się wyśmienicie. odczytać tekst z obrazka. Oczywiście standardowe
DOWIESZ SI
Jednak  jak to w przyrodzie bywa  każdej akcji aplikacje OCR nie poradzą sobie z przeciętnym
co to jest test CAPTCHA,
towarzyszy reakcja. Opracowanych zostało kilka obrazkiem CAPTCHA. Potrzebne są narzędzia
jakie są wady i zalety tego typów ataków, które w mniejszym bądz większym bardziej wyspecjalizowane, stworzone specjalnie na
rozwiązania,
stopniu umożliwiały obejście tego zabezpieczenia. potrzeby łamania akurat tego typu zabezpieczeń.
jak z poziomu kodu C#
Najprostszy atak polega na zatrudnieniu Jednym z takich projektów jest program PWNtcha
wygenerować obrazek
podstawionych osób, które zakładały konta e-mail (ang. Pretend We re Not a Turing Computer but a
CAPTCHA,
chronione przez system CAPTCHA. W końcu osoby te Human Antagonist). Potrafi on prawdopodobnie
o klasach platformy .NET
obsługujących grafikę 2D.
były w stanie odczytać zniekształcony tekst. Problem zdekodować tekst pochodzący ze stosunkowo
w tym, że nikt nie będzie chciał robić czegoś takiego mało skomplikowanych obrazów. Nie należy jednak
CO POWINIENEŚ
za darmo  należy za to zapłacić, co może okazać oczekiwać, że poradzi sobie z każdym obrazkiem.
WIEDZIEĆ
się mało opłacalne dla spamera. Drugi problem to Aby w miarę dobrze działał, należy go dostroić do
znać podstawy języka C#
i technologii ASP.NET. niska efektywność rozwiązania. Inne, dosyć ciekawe konkretnego problemu. Napisałem prawdopodobnie,
16 HAKIN9 6/2008
TEST CAPTCHA
ponieważ autor PWNtcha nie udostępnia klasa nosi nazwę Captcha i będzie częścią pola są wypełnione danymi. Jeśli nie,
tego programu do testów. Jest to dosyć przestrzeni nazw Hakin9. Na początku generowany jest wyjątek. Dalej deklarujemy
logiczne, ponieważ narzędzie mogłoby być zadeklarujemy pola i konstruktory klasy egzemplarz klasy Bitmap, który zawierać
użyte przez spamerów. Innym projektem jest (Listing 1.). będzie obrazek. Na jego podstawie budujemy
aiCAPTCHA. Używa on algorytmów sztucznej Pola width i height będą obiekt klasy Graphics, który umożliwi nam
inteligencji. Nie sądzę jednak, że zostanie przechowywały odpowiednio szerokość rysowanie. Pole, które będziemy wypełniać
stworzony program, który będzie sobie radził i wysokość obrazka. Pole fontSize grafiką, definiujemy za pomocą klasy
ze wszystkimi rodzajami obrazków CAPTCHA. odpowiada za wielkość czcionki. Pole Rectangle.
Ostatnio na świecie pojawiło się coraz więcej text zawierać będzie tekst, jaki ma Płótno, na którym będziemy malować,
przeciwników tego zabezpieczenia. Osoby być umieszczony na obrazku. Pole jest już przygotowane  pora teraz na pędzel.
niedowidzące mają poważne problemy przy random będzie pomocne przy generacji Użyjemy do tego klasy HatchBrush. W
odczytaniu tekstu. Obrazki te są również liczb pseudolosowych, potrzebnych konstruktorze tej klasy przekazujemy styl, kolor
coraz trudniejsze do odczytania przez do losowego dodawania pewnych rysowania i kolor podkładu. Zbiór styli zawiera
dobrze widzące osoby. Taki system wymaga elementów utrudniających programom typ wyliczeniowy HatchStyle  mamy
również od użytkownika pewnej fatygi, a to OCR odczytanie tekstu. Pora teraz napisać do wyboru aż 56 rodzajów wypełnienia.
może skutecznie zniechęcić użytkowników. główną metodę klasy, która będzie Teraz za pomocą referencji g wypełniamy
Przecież korzystanie z Internetu powinno być generowała obrazek (Listing 2.). całość obrazka używając do tego metody
lekkie, łatwe i przyjemne. Istnieje też sporo Metoda ta zwracać będzie obiekt FillRectangle. W tym przypadku wybrany
innych, darmowych i komercyjnych rozwiązań typu Bitmap, czyli mapę bitową. Ponieważ został styl SmallConfetti, ale nic nie stoi
przeciwko botom, jednak test CAPTCHA w definicji klasy zadeklarowaliśmy trzy na przeszkodzie, aby Czytelnik przeciążył
nadal jest  i pewnie jeszcze długo będzie konstruktory, na początku metody Generate metodę Generate z argumentem wywołania,
 wykorzystywany. musimy sprawdzić, czy wszystkie wymagane który umożliwi własny wybór stylu. Jest to
W tym artykule chciałbym zaproponować
stworzenie własnej klasy, która będzie miała
Listing 1. Pola i konstruktory klasy Captcha
możliwość generowania obrazków CAPTCHA.
using System;
Klasa będzie napisana w języku C#, w
using System.Text;
związku z tym będzie ją można używać w
using System.Drawing;
projektach ASP.NET. Użyjemy standardu C#
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
2.0 i .NET 2.0. Program napisany będzie przy
użyciu Visual C# 2008 Express Edition. Niech
namespace Rysunki
{
public class RPicture
{
private int width;
private int height;
private int fontSize;
private string text;
private Random random;
public RPicture()
{
random = new Random();
}
public RPicture(int _width, int _height, int _fontSize)
{
random = new Random();
width = _width;
Rysunek 1. Przykładowe obrazki
height = _height;
zabezpieczające fontSize = _fontSize;
}
public RPicture(int _width, int _height, int _fontSize, string _text)
{
random = new Random();
width = _width;
height = _height;
fontSize = _fontSize;
text = _text;
}
}
Rysunek 2. Przykładowe użycie klasy
Captcha
6/2008 HAKIN9 17
POCZATKI
bardzo proste ćwiczenie, które może wykonać Po tych czynnościach pozostaje nam zawsze w ten sam sposób byłby łatwy do
Czytelnik samodzielnie. tylko wyświetlić przygotowany tekst za oczytania przez programy, które wystarczyłoby
W kolejnym kroku przygotowujemy napis, pomocą metody FillPath. Do narysowania odpowiednio dostosować. Pierwsza pętla
który zostanie umieszczony na obrazku. Klasa tekstu celowo użyty został nieregularny styl dodaje wypełnione elipsy umieszczone
StringFormat przechowuje informacje pędzla oraz zaburzenie tekstu. Utrudni to w przypadkowych miejscach (metoda
dotyczące formatowania napisu. Z kolei programom próbującym zdekodować tekst FillEllipse). Za sprawą odpowiednio
egzemplarz klasy GraphicsPath posłuży odnalezienie liter. W kolejnych dwóch pętlach dobranych współczynników elipsy pojawią
nam do umieszczenia tekstu na obrazku. dodajemy do obrazka losowe zakłócenia. Jest się na obrazku jako kropki, które nie będą
Jest to bardzo ciekawa klasa, niezwykle to konieczne, ponieważ obrazek generowany utrudniały człowiekowi odczytania tekstu z
użyteczna przy tworzeniu fragmentów
aplikacji, które obsługują obiekty graficzne.
Listing 2. Metoda generująca obrazek CAPTCHA
Za jej pomocą możemy rysować różnorodne
public Bitmap Generate()
kształty, wypełniać wnętrza figur itd. Kształty,
{
w tym również tekst, to skończona sekwencja
if (width == 0 || height == 0 || text == null)
połączonych ze sobą linii i łuków. Metodą
throw new NullReferenceException("Please select width, height and text
for image");
AddString dodajemy napis do obiektu
Bitmap picture = new Bitmap(width, height, PixelFormat.Format32bppArgb);
path. Jej trzeci argument odpowiada za
Graphics g = Graphics.FromImage(picture);
styl czcionki. Można wybierać pomiędzy
g.SmoothingMode = SmoothingMode.AntiAlias;
kursywą, pogrubieniem, przekreśleniem i
Rectangle r = new Rectangle(0, 0, width, height);
podkreśleniem. Jak widać na Listingu 2., style
HatchBrush brush = new HatchBrush(HatchStyle.SmallConfetti,
można ze sobą łączyć. Myślę, że pozostałe
Color.LightGray, Color.White);
argumenty wywołania nie wymagają opisu.
g.FillRectangle(brush, r);
Dla tekstu tworzymy jeszcze nowy
StringFormat format = new StringFormat();
pędzel. Wybrany został na stałe styl
format.Alignment = StringAlignment.Center;
LargeConfetti  tak, jak w poprzednim
format.LineAlignment = StringAlignment.Center;
przypadku można przeciążyć metodę
GraphicsPath path = new GraphicsPath();
path.AddString(text, FontFamily.GenericSerif, (int)FontStyle.Bold +
Generate, aby przyjmowała jako argument
(int)FontStyle.Italic, fontSize, r, format);
również ten styl. Tekst powinien być
brush = new HatchBrush(HatchStyle.LargeConfetti, Color.LightGray,
nieznacznie zaburzony. Posłuży do tego
Color.DarkGray);
metoda Warp klasy GraphicsPath. Jedna
float r1 = random.Next(width / 8);
z jej wersji przyjmuje cztery argumenty.
float r2 = random.Next(height / 4);
Pierwszym z nich są punkty definiujące
PointF p1 = new PointF(0, 0);
czworościan, który będzie zawierał
PointF p2 = new PointF(width, r2);
zmieniony obrazek. Drugi argument PointF p3 = new PointF(r1, height);
PointF p4 = new PointF(width, height-r2);
to obrazek zródłowy, trzeci to macierz
PointF[] points = { p1, p2, p3, p4 };
przekształcenia  użyta została macierz
Matrix m = new Matrix();
zerowa. Ostatnim argumentem jest typ
path.Warp(points, r, m, WarpMode.Perspective);
g.FillPath(brush, path);
wyliczeniowy zawierający dwa sposoby
for (int i = 0; i < width / 3; i++)
przekształcania: Bilinear i Perspective.
g.FillEllipse(brush, new Rectangle(random.Next(0, width),
Proponuję samemu poeksperymentować
random.Next(0, height), random.Next(1, width / 20),
z możliwymi transformacjami. Tutaj zostało random.Next(1, width / 20)));
for(int i = 0; iużyte dosyć proste przekształcenie z
g.DrawEllipse(new Pen(brush), (float)random.Next(0, width),
elementami losowości.
(float)random.Next(0, height), (float)random.Next(0, width),
(float)random.Next(0, height));
return picture;
}
Listing 3. Strona obrazek.aspx, generująca testowy obrazek
protected void Page_Load(object sender, EventArgs e)
{
string tekst = "Hakin9";
Captcha image = new Captcha(150, 50, 38, tekst);
image.Generate().Save(Response.OutputStream, System.Drawing.Imaging.ImageForm
at.Jpeg);
Session.Add("tekst", tekst);
}
Rysunek 3. Wynik skanowania obrazka
CAPTCHA przy pomocy FineReader
18 HAKIN9 6/2008
TEST CAPTCHA
obrazka. Dobrym pomysłem jest również obrazek. Obrazek zwracany będzie jako tekst wprowadzony do kontrolki TextBox1 jest
umieszczenie pewnych nieregularnych odpowiedz. Innym rozwiązaniem może być taki sam, jak ten przechowywany w zmiennej
linii, które nachodzą na napis. Jest to duże tymczasowy zapis obrazka na dysku twardym sesji tekst (Listing 5.). Serwis WWW w akcji
utrudnienie dla botów, oczywiście pod serwera, jednak przy sporym ruchu mogłoby przedstawia Rysunek 2. Przeprowadzmy
warunkiem, że linie są rysowane losowo. To się okazać, że na dysku brakuje miejsca do jeszcze prosty test wygenerowanego obrazka.
zabezpieczenie realizowane jest w drugiej zapisu. Strona obrazek.aspx musi zawierać Użyjemy do tego aplikacji FineReader 9.0 w
pętli, która rysuje losowe elipsy z odpowiednio kod obrazka testowego. Odpowiedni kod wersji Professional. Jest to jeden z najbardziej
dobranymi współczynnikami. Na końcu umieścimy w metodzie zdarzeniowej Page _ popularnych programów typu OCR. Jedna z
metody zwracany jest cały obrazek. I to Load (Listing 3.). Jest to jedynie przykład i jego opcji umożliwia skanowanie obrazków
wszystko. Klasa do generowania obrazków pod zmienną tekst powinno się podstawić zapisanych w najpopularniejszych formatach.
CAPTCHA jest już gotowa. Oczywiście można automatycznie wygenerowany ciąg o danej Obrazek CAPTCHA wygenerowany za
do niej wprowadzić szereg modyfikacji. długości. W artykule Automatyczna generacja pomocą stworzonej klasy został zapisany na
Najlepiej umieścić ją w projekcie aplikacji ciągów (Hakin9 5/2008) przedstawiłem jeden dysku jako mapa bitowa. Został następnie
Windows, gdzie z łatwością możemy ją ze sposobów otrzymania takiego ciągu. wczytany za pomocą programu FineReader,
przetestować. Dalej generowany jest obiekt klasy Captcha. po czym dokonano próby odczytania tekstu.
Kolejne zadanie to stworzenie testowego Wygenerowany obrazek od razu zamieniamy Wynik przedstawia Rysunek 3.
serwisu WWW, w którym klasa Captcha na strumień wyjściowy i pakujemy do formatu Program nie jest w stanie odczytać
zostanie użyta praktycznie. Umieszczamy ją w JPEG. Na koniec dodajemy jeszcze zmienną tekstu z obrazka. Oczywiście ten test
projekcie strony ASP.NET. Przypomnę tylko, ze sesji, która przechowywać będzie tekst należy traktować ostrożnie, ponieważ
pliki klas najlepiej umieszczać w podkatalogu umieszczony na obrazku. Strona Default.aspx FineReader jest zoptymalizowany specjalnie
App_Code katalogu projektu. Oczywiście zawierać będzie jedynie cztery kontrolki: do pracy biurowej. Pokazuje on jednak,
na potrzeby artykułu serwis będzie bardzo Image1, TextBox1, Button1 i Label1 że standardowe algorytmy OCR w tym
prosty. Będzie składał się z dwóch stron: (Listing 4.). Pierwsza z nich wyświetlać będzie przypadku zawodzą.
Default.aspx i obrazek.aspx. Pierwsza z nich obrazek CAPTCHA. Jej własność ImageUrl Problem odpowiedniego zabezpieczenia
jest standardową stroną WWW, natomiast ustawiamy na obrazek.aspx. Po kliknięciu wszelakiego rodzaju formularzy
za pomocą drugiej wygenerujemy testowy przycisku Button1 nastąpi sprawdzenie, czy rejestracyjnych przed automatami używanymi
przez spamerów to poważna sprawa.
Listing 4. Strona Default.aspx
Podsumowanie
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_
W zeszłym roku ponad 97% wszystkich
Default" %>
wysłanych maili to niechciana poczta.
Automatyczne wpisy reklamowe na
xhtml1/DTD/xhtml1-transitional.dtd">

forach internetowych nie przysparzają

ich administratorom chwały. Sondaże
Untitled Page
przeprowadzane w Internecie mogą paść

ofiarą botów. Naturalnie test CAPTCHA


nie rozwiąże tych wszystkich problemów,

może jednak zmniejszyć ich skalę.
 

Dodatkowo możemy używać odpowiednich

Text="Sprawdz!" />
problemy z prawidłowym odczytaniem


tekstu z obrazka. Potrafi to zirytować wielu
użytkowników. Jednak jeśli może to pomóc
Size="Larger"
Text="Label">

w ograniczeniu działalności spamerów,

warto poświęcić temu kilka sekund i nieco

wysilić swoje zmysły.

Listing 5. Metoda zdarzeniowa Button1_Click
Sławomir Orłowski
Z wykształcenia fizyk. Obecnie jest doktorantem na
protected void Button1_Click(object sender, EventArgs e)
Wydziale Fizyki, Astronomii i Informatyki Stosowanej
Uniwersytetu Mikołaja Kopernika w Toruniu. Zajmuje się
{
symulacjami komputerowymi układów biologicznych
string pass = Session["tekst"].ToString();
(dynamika molekularna) oraz bioinformatyką.
if (TextBox1.Text == pass)
Programowanie jest nieodzowną częścią jego
Label1.Text = "Nie jesteś botem !";
pracy naukowej i dydaktycznej. Ma doświadczenie w
else
programowaniu w językach C, C++, Delphi, Fortran, Java,
Label1.Text = "Jesteś botem !!!"; C# i Tcl. Współzałożyciel i koordynator grupy .NET WFAiIS.
Jest autorem artykułów i książek informatycznych.
}
Strona domowa: http://www.fizyka.umk.pl/~bigman/.
Kontakt z autorem: bigman@fizyka.umk.pl
6/2008 HAKIN9 19


Wyszukiwarka

Podobne podstrony:
2008 06 Virtual machines [Consumer test]
3E D&D Adventure 06 Test of the Demonweb
2008 06 the Way of the Ray Enterprise Collaboration with Liferay
06 Test konfliktowosc
2008 06 Living Free Free Communications on the Freenet Network
2008 06 Czy boisz się Slackware [Poczatkujacy]
2008 06 teleinformatyk arkusz x
2008 Odpowiedzi Test przed probna matura Arkusz PR Geografia
2008 06 05 WHR B?instrukcja
2008 06 Tworzenie i edycja grafiki online [Grafika]
2008 06 Programowanie grafiki [Programowanie]
2008 Odpowiedzi Test przed probna matura Arkusz PP Geografia
2008 06 Scalix – poczta dla podróżujących [Programowanie]
ŚK 2008 06 Jak zacząć budowę makiety modułowej 3
2008 06 More Sun

więcej podobnych podstron