Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z Captcha
Forum PHP.pl > Forum > Przedszkole
Kojak
Ja mam problem odnośnie systemu captcha (tego co w TYM TEMACIE). Działa dobrze, wyświetla mi obrazek z losowym tekstem. Tylko teraz mam pytanie jak mogę ten tekst odczytać na stronie, żeby sprawdzić czy użytkownik podał poprawny.

Poniżej mam plik captcha.php który generuje obrazek:

  1. <?
  2.   header('Content-Type: image/jpeg');
  3.   $tla           = glob("images/captcha_bcg/{*.jpg,*.jpeg}", GLOB_BRACE);
  4.  
  5.   $czcionki      = glob("images/captcha_fonts/*.ttf");
  6.  
  7.   $znaki         = 'ABCDEFGHIJKLMNPQRSTUWXYZ123456789';
  8.  
  9.   $obrazek_tla   = $tla[array_rand($tla)];
  10.   $liczba_znakow = rand(4, 6);
  11.  
  12.   $cap           = imagecreatefromjpeg($obrazek_tla);
  13.  
  14.   $kolor         = imagecolorallocate($cap, 250, 250, 250);
  15.   $linie         = imagecolorallocate($cap, 205, 205, 205);
  16.  
  17.   for($x = 1; $x <= 50; $x++)        // powtarzamy 50 razy - rysujemy 50 linii
  18.       imageline
  19.       (                        // funkcja rysująca linię
  20.           $cap,                            // uchwyt obrazka
  21.           0,                               // współrzędna X początku linii
  22.           rand(-100,imagesy($cap)+100),    // współrzędna Y początku linii
  23.           imagesx($cap),                   // współrzędna X końca linii
  24.           rand(-100,imagesy($cap)+100),    // współrzędna Y końca linii
  25.           $linie                           // kolor linii
  26.       );
  27.  
  28.   for($x = 1; $x <= $liczba_znakow; $x++)
  29.   {
  30.       $czcionka = $czcionki[array_rand($czcionki)];
  31.       $znak     = $znaki[rand(0, strlen($znaki)-1)];
  32.          
  33.       $odleglosc_miedzy_znakami = (round(imagesx($cap) / $liczba_znakow+1)-10)*($x-1)+20;
  34.          
  35.       imagettftext
  36.       (                      // funkcja pisząca tekst
  37.           $cap,                             // uchwyt obrazka
  38.           rand(15, 23),                     // rozmiar czcionki
  39.           rand(-15, 15),                    // nachylenie znaku
  40.           $odleglosc_miedzy_znakami,        // odległość między znakami
  41.           rand(25, 40),                     // położenie względem górnej krawędzi obrazka
  42.           $kolor,
  43.           $czcionka,
  44.           $znak
  45.       );
  46.   }
  47.  
  48.   imagejpeg($cap);
  49. ?>


System mam oparty na smartach, ale nie będę tego tak przedstawiał bo tylko się namiesza. Więc załóżmy że mam plik register.php:

  1. <?
  2. if (isset($_POST['zarejestrowano']))
  3. {
  4.     $token = $_POST['token'];
  5.     $token_z_obrazka = ... // no właśnie... jak odebrać token z obrazka?
  6.     if ($token == $token_z_obrazka) echo 'DOBRZE';
  7.     else echo 'ZLE';
  8. }
  9. else
  10. {
  11.     ?>
  12.     <form method="post" action="">
  13.     Kod: <img src="captcha.php" alt="obrazek" /><input type="text" name="token" /><br />
  14.     <input type="submit" name="zarejestrowano" value="ZAREJESTRUJ!" />
  15.     </form>
  16.     <?
  17. }
  18. ?>


Na początku próbowałem utworzyć zmienną sesji $_SESSION['token'] i w pliku captcha.php dodawać kolejne znaki do niej. Ale nie działało, poza tym zastanawiam się czy by to było bezpieczne.

Proszę o jakieś sugestie i z góry dzięki smile.gif
marcio
NOm jak to jak ciag ktory wyswietlasz na captcha ktory masz generowany wrzucasz do sesji ktora potem jest globalna i mozesz ja porownac z danymi z POST.
Kojak
No ale właśnie tak próbowałem i nie da rady :/ Robiłem tak:

Plik captcha.php
  1. <?
  2. header('Content-Type: image/jpeg');
  3. $tla = glob("images/captcha_bcg/{*.jpg,*.jpeg}", GLOB_BRACE);
  4. // .......... dalej też to samo co było
  5.  
  6. $_SESSION['token'] = ''; // Stworzenie zmiennej sesyjnej
  7.  
  8. for($x = 1; $x <= $liczba_znakow; $x++)
  9. {
  10.     // ....
  11.     $znak     = $znaki[rand(0, strlen($znaki)-1)];
  12.    $_SESSION['token'] .= $znak;      // dodanie kolejnego znaku do sesji
  13.     // dalej znów to samo....
  14. }?>


Więc na dobrą sprawę powinienem mieć w $_SESSION['token'], gdzie przechowywany jest token wygenerowany przez system. I jak próbuję go odczytać tak jak poniżej to nie działa:

  1. <?
  2. if (isset($_POST['zarejestrowano']))
  3. {
  4.     $token = $_POST['token'];
  5.     $token_z_obrazka = $_SESSION['token'];
  6.     if ($token == $token_z_obrazka) echo 'DOBRZE';
  7.     else echo 'ZLE';
  8. }
  9. else
  10. {
  11.   // to co wcześniej
  12. }
  13. ?>


I to nie działa. Nie wiem czemu... może jakieś pomysły?
Fifi209
Strzelam, nie użyłeś: session_start" title="Zobacz w manualu PHP" target="_manual w tych plikach ? smile.gif
Kojak
Hehe... dobre to o to chodziło.. myślałem że jak dałem wcześniej session_start to w tym pliku captcha.php nie muszę. A jednak... dzięki wielkie. smile.gif
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.