Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Piszemy walidację tekstu z obrazka
Forum PHP.pl > Forum > PHP
L_Devil
Witam

Projektuję, na razie czysto teoretycznie, sposób walidacji tekstu z obrazka, przy określaniu czy użytkownik nie jest botem winksmiley.jpg

Pomysły jakie mam na razie:
1.) Serwer generuje pięcioznakowy kod
2.) Posyła do usera stronkę, z polem na wpisanie kodu i polem hidden, zawierającym:
  1. <?php
  2. $hidden_input = md5($kod_do_wpisania . "blablabla");
  3. ?>

3.) User wklepuje tekst i wysyła na serwer, razem z hiddenem.
4.) Na serwerze następuje sprawdzenie
  1. <?php
  2. if(md5($_POST['key_typed'] . "blablabla")==$_POST['hidden_input'])
  3. {
  4. echo "Witaj człowieku";
  5. }
  6. else
  7. {
  8. echo "Spadaj bocie";
  9. }
  10. ?>


Wbrew pozorom ten algorytm jest bezpieczny: Nie znając owego ciągu znaków (czyli "blablabla" - a on nie jest nigdy przesyłany do usera), haker nie może podrobić takiego pola hidden, żeby pasował do tego, co wpisze jego bot w główne pole.

I to jest dla mnie jasne.

Problem zaczyna się wtedy, kiedy muszę wygenerować grafikę z kodem. Muszę do pliku php posłać link z przylepionym odpowiednią wartością GET. Jest z tym problem, mianowicie mój skrypt nie może korzystać z bazy danych, ani zapisywać nic do pliku, czyli do pliku php generującego grafikę, muszę posłać ów pięcioznakowy kod. Pytanie - jak to zrobić, żeby user nie zdołał go przechwycić?

Może trochę zagmatwałem, więc postaram się wyjaśnić:

User ma już stronę do wklepania, na której znajduje się obrazek
  1. <img src="obrazek.php?kod=XXX">
Pytam się, jak przez wartość XXX posłać kod do skryptu "obrazek.php" tak, żeby user nie był w stanie jej przechwycić

Muszę przyznać że myślałem sam nad tym rozwiązaniem i jedynym pomysłem, jaki przyszedł mi do głowy, jest wykorzystanie algorytmu blowfish (sekretny ciąg znaków byłby znany zarówno dla pliku głównego php, jak i tego, który generuje grafikę). Nie wiem jednak, jaką funkcją php można zaimplementować dwustronne (chodzi o możliwość odkodowania informacji, gdy znany jest jej unikalny ciąg znaków, użyty do kodowania) kodowanie blowfish.
Nightwalker
hmm, obrazek możesz poddać mod_rewrite żeby był link typu <img src="kodzik.jpg" /> a w rzeczywistości skrypt.php?kod=XXX

ewentualnie wykorzystac sesje do przechowania informacji o kodzie.
L_Devil
Nie chcę sesji, nie chcę mod_rewrite.

Chcę zakodować pięcioznakowy kod w XXX tak, by skrypt generujący obrazek mógł go zdekodować, ale haker, który ogląda tą stronę już nie
Nightwalker
Ale nie prościej użyć sesji? wszystko będzie po stronie serwera i haker tego nie odczyta, wg mnie to najlepszy sposób...

Ps. nie wiem dlaczego tak się przed tym bronisz...
L_Devil
Niestety, fakt nie używania sesji nie zależy ode mnie. Prosiłbym bardziej o jakieś odpowiedzi na temat winksmiley.jpg Może tak: Wiesz, jak używać w php algorytmu blowfish?
Nightwalker
Nie używałem nigdy tego, ale znalazłem coś takiego: http://www.koders.com/php/fidBE302167DA8C6...aspx?s=blowfish
L_Devil
Byłoby to to o co mi chodzi, gdyby fakt że zachowuje się dość dziwnie :/

Ustawiłem metodę setKey na jednej stronie, zakodowałem ciąg znaków, a potem go odkodowałem. No dobrze, działa. A teraz wstawiłem oba do osobnych plików. Efekt? Z nonsensu wyszedł nonsens. Nawet dwukrotne wywołanie metody setKey z idendtycznym parametrem powoduje, że skrypt nie umie zdeszyfrować tego, co zakodował. Poza tym raczej nie widzę praktyczności linków w postaci "skrypt.php?key=­ 9Ő�4h¤" tongue.gif

Niemniej, dziękuję za zainteresowanie smile.gif
E-d
Zamiast ułatwiać życie, utrudniasz je sobe. Walidacje obrazkami robi się za pomocą biblioteki GD i sesj. Tu masz klase z użyciem tego. Możesz użyć ją u siebie w skrypcie. A i polecam Ci przeczytanie jeszcze tego lub/i tego.

A i zawartość pola hidden można łatwo odczytać, więc dodawanie czegoś przez pole hidden jest mało bezpieczne. Lepiej już przez zmienne w php.
Hacker
Cytat
Nie chcę sesji, nie chcę mod_rewrite.

Chcę zakodować pięcioznakowy kod w XXX tak, by skrypt generujący obrazek mógł go zdekodować, ale haker, który ogląda tą stronę już nie


Skoro podajesz zdekodowaną wartość (w obrazku) i jej zakodowany odpowiednik, i nie jest to funkcja haszująca to jakim prawem twierdzisz, że "haker" odpowiedniego nie może napisać bota??

Używaj sesji!
L_Devil
tak, tylko że do utworzenia zakodowanego odpowiednika potrzeba znać ciąg znaków, który jest znany tylko dla serwera (nie jest przesyłany do usera w żadnym miejscu). Tak więc haker nie może sobie sfałszować obu inputów - hiddena i textboxa.

Pole hidden może być odczytane, mnie to zwisa. Nie ma to żadnego znaczenia jeżeli chodzi o bezpieczeństwo skryptu

Gdybym mógł skorzystać z sesji nie byłoby problemu. Wiem jak to zrobić. Pytam się - co robić, jeżeli z sesji/bazy danych (także tekstowej) korzystać nie mogę?
E-d
Czemu nie może ? Patrzy w kod, kopiuje kod, zapisuje i już ma.
Cytat
Pole hidden może być odczytane, mnie to zwisa. Nie ma to żadnego znaczenia jeżeli chodzi o bezpieczeństwo skryptu

Ma. Przecież sprtny BOT dojdzie do wartości (value) w polu hidden, wczyta go w pole do wpisania kodu i doda 100000.... danych więc to nie ma sensu bo to żadne zabezpiecznie. Gdy używasz sesj, odczytać kodu nie można, więc jest to dużo bezpieczniejsze.
L_Devil
Nie może, skoro pole hidden jest zahashowane md5 i to nie w sposób "czysty" tongue.gif
Hacker
hmmmm...
skoro do obrazka przekazujesz w getcie zakodowany ciąg nie funkcją haszującą, bo skrypt nie mógł by jej odczytać. A na obrazku masz podany ten ciąg tylko, że zdekodowany. To "haker" po kilku analizach. Będzie wiedział jak kodujesz parametr get i stworzy pięknego bota.
snipe
Kwestia zrobienia bota o ktorym mowicie to pol godziny roboty winksmiley.jpg
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.