paź
28
2012

Zabezpieczenie formularza cz.1 – token i klucz prywatny

formularz antyspamowy antispam form Każdy właściciel/programista strony internetowej z możliwością rejestracji konta lub formularzem kontaktowym spotka się ze spamem, a dokładnie spamBotem :) Masową, śmieciową wysyłką formularzy lub fałszywych rejestracji kont.

Na szybko myślimy, jak zabezpieczyć formularz… rozwiązania są proste i na pewno nie należy do nich autystyczna CAPTCHA! Nikt z nas przecież nie lubi domyślać się “Co jest napisane na tym obrazku o_O ???!!!!”

Przedstawię serię krótkich artykułów z prostymi metodami zabezpieczania formularza, bez absorbowania szarych komórek użytkownika naszej strony www ;)
Na wstępie zaznaczam, że poniższa metoda przyda się tylko osobom nie mających dostępu do użycia sesji oraz JavaScript. Działa tylko w przypadku, gdy bot wcześniej nie wygeneruje dla siebie formularza.
 

Token, klucz prywatny i publiczny

Opis działania
Całość opiera się na operowaniu trzema wartościami: tokenem, kluczem prywatnym oraz kluczem publicznym. Ich deklaracja, przesyłanie i walidacja poprawności.

  1. Deklarujesz w stałych lub zmiennych wartość klucza publicznego oraz prywatnego (np. jest to ciąg losowo wygenerowanych znaków). Klucz prywatny nie jest widoczny (jest zaszyty w skrypcie), dzięki niemu sprawdzisz poprawność tokena. Tylko klucz publiczny i token uwidaczniasz, przesyłając go w formularzu.
  2. Generujesz token z klucza prywatnego oraz klucza publicznego.
  3. Dodajesz dwa inputy typu hidden w formularzu widocznym dla użytkownika na stronie www.
  4. W inputach umieszczasz wartość wygenerowanego tokena oraz wcześniej zadeklarowaną wartość klucza publicznego.
  5. Użytkownik wysyła wypełniony przez siebie formularz.
  6. Skrypt PHP, który odbiera dane z wysłanego formularza waliduje przesłany token na podstawie przesłanego klucza publicznego oraz ukrytego klucza prywatnego.

 

Przykładowy kod PHP + HTML

Część odpowiedzialna za wygląd formularza.

 

Część w miejscu, gdzie skrypt odbiera dane z wysłanego formularza.

 

Dodatkowe informacje

  • Klucz prywatny i publiczny można deklarować według własnego pomysłu. Powyżej jest tylko przykład. Najlepiej klucze zadeklarować jako stałe w pliku, który będzie inkludowany na stronie z formularzem i skryptem odbierającym z niego dane.
  • Przesyłane dane można dodatkowo sprawdzać według ich typu (sanitize), np. tylko liczba, tylko litery i znaki itp. Używając funkcji preg_replace().
  • Token należy kodować w jedną stronę funkcją haszujacą, np. md5 lub bezpieczniejszym sha1.
  • Wzór na generowanie tokena jest dowolny. Może być to np. zwykłe łączenie ciągów. Im więcej danych w tokenie tym lepiej. Ze zwykłego łączenia ciągu znaków korzystając serwisy z płatnościami. Nie trzeba się bawić w generowanie liczb, jak powyżej :)
  • Powyższą metodę łatwo obejść. Wystarczy, że bot wygeneruje najpierw dla siebie formularz z uzupełnionym kluczem publicznym i tokenem i następnie go prześle. Zadziała tylko w przypadku, gdy bot dobija się od razu do skryptu odbierającego dane. Dlatego też zalecam go w przypadku braku możliwości użycia sesji lub JavaScript.

Autor wpisu: Arkadiusz Krakiewicz

Programista i właściciel sklepu jednocześnie, dzięki temu rozumie potrzeby osób prowadzących sprzedaż w internecie. Od 2006 związany z eCommerce. Zaczynał jako freelancer tworząc sklepy oraz strony www. Aktualnie zajmuje się: programowanie w PHP, Symfony 2, Android, PrestaShop, osCommerce, OpenCart, WordPress.

2 komentarzy + Dodaj komentarz

  • Według mnie to bardzo słabe zabezpieczenie, każdy szanujący się robot do rozsyłania spamu to obejdzie. Przecież wystarczy zapuścić prosty test w Sellenium i to rozszyfruje (bo tu nawet nie ma rozszyfrowywać tylko wygenerować stronę). Jakby istniało coś bezpieczniejszego od interakcji z userem to dawno by coś takiego powstało. Dlatego reCaptcha jest uważana za jedno z najbezpieczniejszych rozwiązań.

  • OK, ten skrypt jest bardzo prostą metodą.
    Działa tylko przy bezpośrednim wysyłaniu danych do skryptu.
    Aby to obejść, bot musiałby najpierw wejść na stronę z wygenerowanym formularzem, sczytać dane z inputów i następnie je przesłać. Tak wiem, nie jest to trudne ;)

    Lepszym rozwiązaniem jest użycie tokena w sesji.

    Ale dzięki za zwrócenie na to uwagi ;)

Dodaj komentarz

Anti-Spam

O mnie

Arkadiusz Krakiewicz
Programista aplikacji webowych dla branży eCommerce. Jednocześnie jako właściciel sklepu zna od "podszewki" potrzeby osób prowadzących sprzedaż w internecie.
W swoich rozwiązaniach stawia na funkcjonalność i wydajność aplikacji pod kątem obsługi klienta.
[X]
Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików cookies.
Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.
Więcej w Skrypty i moduły
Wysyłka czasomierz
Odliczanie czasu wysyłki (timer) – skrypt jQuery + JavaScript

W dobie szybkich płatności online i stałego usprawniania logistyki w eCommerce, nasi klienci przyzwyczajają się do ekspresowej obsługi zamówienia. Kupując...

Zamknij