![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 17 Dołączył: 13.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
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:
Co odbiera mi możliwość wprowadzenia tam formularza. Próbowałem z sesją. Dodałem na końcu captcha.php coś takiego:
A potem w pliku test.php:
Ale to nic nie daje...Jeśli w pliku captcha.php mam:
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ć? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 548 Pomógł: 105 Dołączył: 4.06.2010 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował Orzeszekk 3.03.2012, 00:21:06 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 18.03.2013 Ostrzeżenie: (0%) ![]() ![]() |
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> |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Temat captchy, był już wielokrotnie poruszany i wyczerpany. Twoje "2+2" to żadne zabezpieczenie. Użyj wyszukiwarki.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 18.03.2013 Ostrzeżenie: (0%) ![]() ![]() |
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ć? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
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 Ten post edytował !*! 18.03.2013, 14:05:36 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 05:12 |