Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: CAPTCHA class pre relase
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
kkrzyzak
Witam. Ostatnio zainteresowało mnie to, co kiedyś uważałem za największe zło- Captha. Uważałem tak, głównie ze względu na dostępność- jednak opróćz tego standardowe capthy są często dość proste do złamania- potwierdza to min. ta strona z tego też powodu postanowiłem się wziąć za swój wynalazek, który będzie troszkę odmienny od innych prezentowanych Capth.
Czym zatem różni się moja Captha od innych?
Tutaj nie trzeba przepisać jakiegoś konkretnego słowa- należy natomiast podać ilość symboli- w chwili obecnej są to bardzo tandetne kółka- docelowo zastanawiam się nad jakimiś zwierzątkami bądź znaczkami.
Jest to baaardzo wczesna wersja- na chwilę obecną nie nadaje się jeszcze do zastosowania jako captha w jakimkolwiek serwisie, jednak cały czas nad nią pracuję.
TODO:
-większa elastyczność (póki co tylko wielość CAPTHy jest w miarę edytowalna, natomiast kolorystyka itp- nie bardzo) -jednak to z tego powodu, że: captha będzie korzystała z kilku różnych teł, a kolorystyka kółek i tak chyba zostanie wymieniona.
-zrobienie pytania w stylu "ile jest żółtych kółek na obrazku" - tu jednak muszę dobrać takie kolory, by daltoniści nie mieli problemów (o ile takie kolory istnieją....)
-implementacja jakichś obrazków zamiast figur geometrycznych (muszę jednak znaleźć coś małego i łatwo rozpoznawalnego)
-poprawienie buga - w chwili obecnej obrazki są tworzone w temp`ie a nie są usuwane- po paru testach muszę ręcznie usuwać stare obrazki smile.gif
Kod Klasy:
  1. <?php
  2. class Kaptha{
  3. private $width='300';
  4. private $height='100';
  5.  
  6.  
  7. function showCaptha(){
  8. $img = @imagecreatetruecolor($this->width, $this->height);
  9. if(!$img){
  10. throw new exception('Cannot create image');
  11. }
  12. return $this->drawElipse($img);
  13. }
  14.  
  15.  
  16. function drawElipse($img){
  17.  
  18. $col_ellipse = imagecolorallocate($img, 255, 255, 255);
  19. $col_rectangle = imagecolorallocate($img, 50, 55, 50);
  20.  
  21. $elipses=rand(0,7);
  22. $correctResult=10-$elipses;
  23.  
  24. for($elipses;$elipses<10;$elipses++){
  25. $horizonPos+=rand(15,20);
  26. imageellipse($img, $horizonPos, rand(15,80), 10, 10, $col_ellipse);
  27. }
  28.  
  29. // for($i=rand(5,8);$i<10;$i++){
  30. // imagerectangle($img,rand(10,90),rand(10,100),rand(20,190),rand(80,160),$col_rectangle);
  31. // }
  32.  
  33. $imgname=base64_encode('captha').rand(0,999);
  34. imagepng($img,'temp/'.$imgname.'.png');
  35. $_SESSION['CapthaCorrectResult']=$correctResult;
  36. return 'temp/'.$imgname.'.png';
  37. // imagedestroy($img);
  38.  
  39. }
  40.  
  41. }
  42. ?>

użycie:
  1. <?php
  2. include('captha.class.php');
  3. $captha = new Kaptha;
  4. echo '<img src="'.$captha->showCaptha().'" />';
  5. print_r($_SESSION);
  6. ?>

dla osób niecierpliwych- screen działania smile.gif


Jak już mówiłem, klasa jest na bardzo wczesnym stopniu rozwoju. Prosiłbym jednak o wszelkie sugestie dotyczące implementacji- klasa będzie na GPL`u, i chciałbym, aby przydała się komukolwiek smile.gif
---------------------------UPDATE-----------------------------
ok, zamiast kółek są uśmiechnięte buźki i dla utrudnienia smutne- wiem, troszkę captha dla debili, ale narazie takie obrazki znalazłem, które sa łatwo rozpoznawalne smile.gif
w chwili obecnej największym problemem jest to, że zdarza się, że ikony nachodzą na siebie- postaram się to naprawić w najbliższym czasie. Dodałem też podgląd aktualnego postępu prac
ano
Nie patrzyłem w kod (nie znam się raczej na php ;-) ) ale mam kilka rad:
1. Stosuj większe rysunki buźek/kółek czy czegoś innego.
2. Nie dawaj tak dużo tych rysunków, max. 6 (nikomu nie chce się liczyć 31789 małych buźek wielkości 5 x 5px! ;D)
3. Mam pomysł jakbyś mógł rozwiązać problem nakładania się tych symboli:
Kod
--O-O-
-O----
---O-O

O oznacza symbol, - oznacza pustą przerwę pomiędzy symbolami,
Rozumiesz mniej więcej o co chodzi?
a ) pierwszy rysunek w odległości 2 od lewego boku, losowanie wysokości na której ma być obrazek
b ) drugi obrazek w odległości 5 od lewego boku (promień obrazków to np. 2) i także losowanie położenia wzg. osi Y dla tego obrazka
itd..
kkrzyzak
Cytat
Nie patrzyłem w kod (nie znam się raczej na php ;-) ) ale mam kilka rad:

i właśnie takie rady są dla mnie najcenniejsze smile.gif
Cytat
1. Stosuj większe rysunki buźek/kółek czy czegoś innego.
najpierw muszę ostatecznie ustalić, co ja będę rysował, a potem dopiero dopasuję rozmiar- jednak wielkość napewno zmienię.
Ad.2 - w tej chwili jest wadliwa implementacja (docelowo ma być 10 obrazków w sumie,a teraz jest max 10 poprawnych obrazków- choć to będzie do edytowania )
Ad3. Bardzo dobry pomysł- zaraz postaram się go wprowadzić w życie.
dr_bonzo
Matko, zdecyduj sie na jedna pisownie CAPTCHA'y. Poprawiam tytul topiku.
ShaXbee
Skoro już rozmawiamy o Captcha polecam stronę http://sam.zoy.org/pwntcha/ która pokazuje które algorytmy captcha są już nieskuteczne. Obawiam się że Twój algorytm nie będzie specjalnie wymagający dla automatu...
kkrzyzak
...gdyby Ci się chciało przeczytać mojego posta, zobaczyłbyś, że podawałem tamtą stronę. A uwierz mi, że (chyba) nie istnieje automat, który będzie w stanie odróżnić mrówki od żyrafy (bo tego typu pytania będą w wersji finalnej) (ba, na podanej przez Ciebie stronie tego typu captha jest oznaczona jako "An excellent idea, but a critically buggy implementation." ) -niestety, jestem w stanie rozwijać ją tylko w weekendy, więc narazie wiele nie zrobię...
DjKermit
Twoja klasa podsunęła mi pewien pomysł, który mógłbyś w niej zaimplementować:
zamiast buziek żyraw itp mógłbyś rysować figury geometryczne w różnych kolorach i zadawać pytanie typu "ile jest czerwonych kółek?" rozwiązało by to kilka problemów np. pisownia (żyrafa, rzyrafa, zyrafa) nie wspominająć o tym że ktoś może pomylić konia z zebrą lub jabłko z pomidorem i odwrotnie.
kkrzyzak
maaan, ludzie, czytajcie całe posty....
Cytat
-zrobienie pytania w stylu "ile jest żółtych kółek na obrazku" - tu jednak muszę dobrać takie kolory, by daltoniści nie mieli problemów (o ile takie kolory istnieją....)
DjKermit
Cytat(kkrzyzak @ 23.01.2007, 19:31:08 ) *
maaan, ludzie, czytajcie całe posty....

Sorki.
Widocznie był za długi tongue.gif


Cytat(kkrzyzak @ 21.01.2007, 13:24:55 ) *
docelowo zastanawiam się nad jakimiś zwierzątkami bądź znaczkami.

Poza tym to rzuciło mi się w oczy.
doseo
Obrazek tego typu jest w miarę prosty do złamania bo wystarczy napisać algorytm wyznaczający odpowiednie obiekty* w obrazku

Algorytm mógłby wyglądać tak:

1. Utworzyć macierz M z obrazka.
2. Znaleźć biały pixel
Jeśli istnieje to Utworzyć nowy obiekt O[i++]* i dodać do niego ten pixel (współrzędne) i ustawić go na stos.
jeśli nie to przejść do kroku 4.
3. Pobrać ze stosu element . Dodać do obiektu. Usunąć go z macierzy M. Dodawać do stosu sąsiednie pixele, jeśli są białe.
Powtarzać krok 3 dopóki są elementy na stosie.
Jeśli nie elementów na stosie to wrócić do kroku 2.
4. Policzyć ilość obiektów O.

Jeśli trzeba by było policzyć żabki na obrazku który zawiera też samochodziki to w kroku 4 trzeba by było zrobić porównywanie z wzorcami.

* obiekt nie w znaczeniu informatycznym, może to być tablica np. $O[$i][$x][$y] = true; $x i $y to współrzędne pixela.
kkrzyzak
hmm... i to mi daje do myślenia. a co myślisz o rysowaniu żyrafy, nosorożca itp i prawidłową opcją byłaby nazwa zwierzątka? tu jednak problem jest z dysortografami....
mokry
Nie wiem, może takie coś już jest, ale normalne captcha, ale należy podać wartość od tyłu?

czyli na captcha jest: 5jk435
a trzeba podac: 534kj5
Ociu
Skrypt nawet fajny. Kedyś, kiedyś na blogu wassago była dość fajna dyskusja na temat zabezpieczeń formularzy przeciwko robotom. Była matematyka, były rysuneczki, było wpisanie jakieś literki w input, ale kolega chmolu podsunął dośc fajny pomysł.
Otóż wiadomo, że roboty uzupełniają wsyzstkie inputy, nawet hidden, wystarczy stworzyć jeden hidden i sprawdzać czy jset pusty, czy nie.
seaquest
Lepiej ukryć pole cssem albo użyć JS do wysyłania formularza.

Ani jednego ani drugiego roboty nie potrafią czytać i interpretować.
devnul
ukryte pola można w konfiguracji bota wyeliminowac, a co do tematu to lipa - jesli kułek 9buziek, żyraf czy co tam dasz) będize kilka to robot ez trudu podstawiając ciągle jakieś liczby trafi na tą właściwą - nawet bez interpretacji samego obrazka. przewaga przepisania ciągu znaków jet taka że wymaga poprawności ałęgo ciągu - a u ciebie wystarczyłoby podac cyferke - więc kombinacji jest duuużo mniej. co za tym idzie - banalnie proste do złamania - bo najmniej czasu zabiera wysłanie danych ze spamem a najwiecej interpretacja obrazka. dobrym pomysłem jest nazywanie zwierząt czy przedmiotów (zniekształconych jakimś efektem) - robot nie da sobie rady - szczególnie przy duzej ilości obrazków - a człowiek w razie w moze zarządać przerysowania obrazka (z np nowym efektem zniekształcenia, który być może będize bardziej czytelny dla człowieka). Pozatym - capache mozna dawać jako tło - z tym zaden automat bez recznej konfiguracji sobie nie poradzi - szczególnie jesli obrazek bedzie zdefiniowany w osobnym pliku.
bugme
Nie ma sensu tego w ogóle robić, gdy dostępny jest skuteczniejszy, automatyczny filtr: http://sblam.com/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.