Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzanie poprawności wpisanego kodu - Captcha
Forum PHP.pl > Forum > PHP
Majkelo23
Jak mogę sprawdzić czy kod podany przez usera, jest zgodny z tym co ma w obrazku. Mam plik captcha.php i wyświetla on grafikę captchową. Ale jak próbuję dorzucić tam formularz, który by sprawdzał poprawność to nie da rady, ponieważ zdefiniowane mam tam:

  1. header('Content-Type: image/jpeg');


Co odbiera mi możliwość wprowadzenia tam formularza.
Próbowałem z sesją. Dodałem na końcu captcha.php coś takiego:

  1. $_SESSION['captcha'] = $tabb;



A potem w pliku test.php:

  1. <?php
  2. require_once('captcha.php');
  3. echo $_SESSION['captcha'];
  4. ?>


Ale to nic nie daje...Jeśli w pliku captcha.php mam:

  1. imagejpeg($background);


To wyświetla mi w test.php TYLKO grafikę (captchę), bez tego echa. Z kolei jeśli tej linijki nie mam to wyrzuca mi błąd:
Kod
Obrazek „http://test.pl/test.php” nie może zostać wyświetlony, ponieważ zawiera błędy.


Jak to mogę sprawdzić?
CuteOne
  1.  
  2.  
  3. $_SESSION['captcha'] = $captcha = 'aefw';
  4.  
  5.  
  6. //tu generowanie obrazka z liter w zmiennej $captcha
  7.  
  8. header('Content-Type: image/jpeg');


  1.  
  2. if($_POST['captcha'] == $_SESSION['captcha']) { }

kadlub
ja bym jeszcze zastosował jakiś losowe generowanie liter
najpierw je wygenerować potem zapisać do sessi w ten sposób za każdym odświeżeniem strony będzie inny kod na obrazku a tak to po co to strasznie stayczne jest i każdy automat sobie z tym poradzi
absflg
Ten sposób jest ekstremalnie zawodny... Wystarczy, że ktoś otworzy dwie karty przeglądarki i zostanie odrzucony dobry kod (bo wygenerowano w międzyczasie nowy).

Moje 2 propozycje:
Albo użyć gotowego rozwiązania (np. reCaptcha, czy jakoś tak), albo...

W danych sesji stworzyć tablicę. Za każdym razem gdy tworzysz formularz z obrazkiem do przepisania robisz następujące rzeczy: generujesz ciąg do przepisania, tworzysz mu unikatową sygnaturę (np. dodaj na końcu czas i potraktuj go funkcją hashującą), dopisujesz do tablicy w sesji ( $_SESSION['tablica'][$sygnatura] = $tekst_do_przepisania; ). Dodajesz do formularza ukryte pole z sygnaturą. Dodajesz obrazek podając sygnaturę jako parametr (skrypt generuje obrazek w oparciu o tekst zapisany w sesji). Bezwzględnie po każdej próbie (udanej czy nie) kasujesz kod z tablicy w sesji.

Nie jest to doskonałe, ale mniej podatne niż poprzednie proponowane.
Orzeszekk
http://www.google.com/recaptcha

Oto rozwiązanie twoich problemów.

Jeżeli chcesz napisać kod który rozwiązuje jakiś problem, upewnij-się że twój kod będzie lepszy niż istniejące rozwiązania.
http://pl.wikipedia.org/wiki/Antywzorzec_projektowy
Odkrywanie kwadratowego koła (ang. Reinventing the square wheel) Rozwiązywanie problemu w zły sposób, podczas gdy istnieją skuteczne i sprawdzone rozwiązania. Na przykład tworzenie własnego systemu bazodanowego, zamiast wykorzystania istniejących darmowych rozwiązań, z dużym prawdopodobieństwem lepszych niż sami jesteśmy w stanie stworzyć.

Pisałem własną captche kiedyś, nie jest to robota na tydzień, ani na 2 tygodnie. A teraz i tak uzywam reCaptchy.
taką wlasna biblioteke trzeba debugowac, odpluskwiac, pielegnowac zeby byla uzyteczna, to bez sensu bo to odciaga od wlasciwego tworzenia aplikacji. Orobisz sie przy captchy, zabraknie ci sily na twoj portal. To jak skupic sie na produkcji kluczy bardziej niz na naprawach będąc mechanikiem samochodowym.

jesli chcesz by twoja captcha byla skuteczna, musi:
-generowac obrazki w locie
-litery znieksztalcac beczkowatym (lub innym nielinearnym) znieksztalceniem
-byc przystepna dla niewidomych
-byc w miarę czytelna dla ludzi
-trudna do zlamania przez boty
-poprawne odpowiedzi dla każdego zadania wrzucac do bazy danych a nie do jakiejś smiesznej sesji

do każdego zadania captchy generujesz token i wysyłasz go razem z formularzem na którym jest captcha, do bazy wpisujesz token i prawidlowe rozwiazanie zagadki, na koniec sprawdasz czy dla tego tokena rozwiazanie wpisane przez usera sie pokrywa z rozwiazaniem w bazie i hola. Dorzuc do tego jeszcze timestamp (i sprawdzaj czy ta captcha nie pochodzi z czasu pozniejszego niz np. 20 minut) i moze jakos tam to będzie działało.

proste captche ze statycznych obrazków, lub skladane dynamicznie ale bez zadnych przeksztalcen to kaszka manna dla botów, i taką captcha nie uchronisz strony od botów, a co najwyzej wk...isz ludzi. Weź skrypt re-captchy, sformatuj ją pod swoje potrzeby, mozesz kompletnie zmienic jej wygląd, jak np tu: Przykladowa recaptcha ze zmienionym wygladem i smiga...

PS. Sesja w PHP to jest akurat jedna z tych niewielu rzeczy, która jest do d...y i trzeba ten mechanizm sobie napisać samemu lub użyć innego gotowego, ale nie tego dostarczanego z PHP. Moze dobry framework załatwi sprawę? Obejrz sobie cakePHP, Kohanę, lub Symfony i wybierz cos dla siebie.
NeXiQ
Korzystając z tego, że mój problem dotyczy tego samego problemu - postanowiłem się podpiąć.

Chodzi mi o pole w formularzu, które np będzie podpisane: PODAJ WYNIK 2+2: ........

jeśli wypełniający wpisze poprawnie "4" - wówczas wysyła się formularz
jeśli wpisze błędnie - nie wysyła go wcale.

mój kod formularza 'form':

Kod
<?php
$imie =  $_POST['imie'];
$in =  $_POST['in'];
$inn =  $_POST['inn'];
$out =  $_POST['out'];
$outt =  $_POST['outt'];
$ile =  $_POST['ile'];
$ile2 =  $_POST['ile2'];
$tel =  $_POST['tel'];
$mail =  $_POST['mail'];
$info =  $_POST['info'];
$kod =  $_POST['kod'];

if ($imie && $ile && $mail && $tel && $in  && $inn  &&  $out  &&  $outt  &&  $ile2  &&  $info  &&  $kod) {
$wiadomosc = "Imie: $imie\nLiczba dorosłych: $ile\nLiczba dzieci: $ile2\nTelefon kontaktowy: $tel\nEmail: $mail\nData przyjazdu: $in $inn\nData wyjazdu: $out $outt\nUwagi: $info\n";
$header = "From: $mail\r\nReply-To: $mail\r\nContent-Type: text/plain; charset=utf-8";
mail ("xxxxxxxx@xxxxxxxxxxxxxxxxx.pl", "Rezerwacja PL - Formularz ze strony", $wiadomosc, $header);
mail ("$mail", "POTWIERDZENIE:Rezerwacja PL - Formularz ze strony", $wiadomosc, $header);
}
header("Location: rezerwacjee.html");
?>


<oczywiście w meilu zamiast xxx@xxx.pl jest odpowiedni adres e-mail>
!*!
Temat captchy, był już wielokrotnie poruszany i wyczerpany. Twoje "2+2" to żadne zabezpieczenie. Użyj wyszukiwarki.
NeXiQ
Tyle, że ja nie chce "captchy".
Chce coś prostego i niewielkiego bo nie mam miejsca na stronie w miejscu gdzie jest formularz.

Dlaczego "2+2" to nie zabezpieczenie ?

PS: pytanie moje dotyczyło jak zrobić "2+2", a nie czy to jest wystarczające zabezpieczenie.

Tak więc? Gdzie i jak to wykonać?
!*!
Jak wygląd na stronie jest dla Ciebie ważniejszy niż bezpieczeństwo, to nie wstawiaj tego w ogóle.

Cytat
Dlaczego "2+2" to nie zabezpieczenie ?

Obejście tego jest banalne, jak odczyt kodu z prostego obrazka.

Cytat
PS: pytanie moje dotyczyło jak zrobić "2+2", a nie czy to jest wystarczające zabezpieczenie.

W sesji zapisz wynik końcowy tego o co pytasz w formularzu. W nim samym zrób nowy input i sprawdzaj czy dane z sesji zgadzają się z tym co podał użytkownik lub w tym wypadku bot.

http://pl.wikibooks.org/wiki/PHP/Sesje
http://pl.wikibooks.org/wiki/PHP/Formularze
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.