Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Formularz - zabezpieczenie
Forum PHP.pl > Forum > PHP
michaelt
Witam, 

Szukam odpowiedzi / podpowiedzi na rozwiązanie takiego problemu:

mianowicie jest sobie formularz np: form.php gdzie action="obsluga.php" method="post".

obsluga.php, oczywiście przetwarza / filtruje dane z formularza i wysyła na maila / dodaje do sql itd...

Pytanie brzmi jak sprawdzić, czy dane przesłane postem do obsluga.php rzeczywiście pochodzą z form.php? Wiem, że jest coś takiego jak token, ale szukam innego rozwiazania, trudnego do przejscia. Ktoś spreparował formularz taki jak na mojej stronie i automatycznie wysyła mi dane do obsluga.php . Filtrowanie i sprawdzanie nic nie daje bo wszystkie value są również generowane automatycznie / za każdym razem różne ( coś w style rand ) - funkcje sprawdzające mają ograniczone możliwości np. imię i nazwisko składają się wyłącznie z liter, adres e-mail też sie zgadza etc.... 

Macie jakieś rozwiązania na tego typu problem?




Matte
$_SERVER['HTTP_REFERER'] Przekazuje z jakiej strony nadeszło odwołanie, jednak to można nadal oszukać.
michaelt
Tak też już próbowałem, ale rzeczywiście bardzo prosto można to oszukać sad.gif 

Tak prosto mowiąc potrzebne jest coś w stylu funkcji, która sprawdzi czy submit został kliknięty na danej stronie ( czyli form.php ).

blooregard
Do formularza dodajesz 2 pola hidden: pierwszemu przypisujesz value='jawna_wartosc' , drugiemu value=md5('znana_tylko_tobie_sól' . 'jawna_wartość');

W f-cji walidującej formularz sprawdzasz, czy md5('znana_tylko_tobie_sól'.'wartosc_z_pierwszego_pola_hidden') == value drugiego pola hidden, czyli hash tych wartości (powinny być identyczne).
Jeśli nie są - ktoś majstrował przy formie. Nawet, jeśli odkryje, że drugi hidden zawiera hash MD5, nie będzie w stanie spreparować prawidłowego hasha nie znając wartości 'znana_tylko_tobie_sól', nawet mając na tacy 'jawna_wartość'. W ten sposób masz pewność, że dane pochodzą z prawidłowego FORM-a.
erix
Referer, to delikatnie mówiąc - zły pomysł - wiele zintegrowanych pakietów bezpieczeństwa po prostu blokuje wysyłanie tego nagłówka.

Zostaje tylko generowanie pseudolosowego tokena, zapisywanie go w sesji oraz wysyłanie w formularzu. Przy odbiorze porównujesz obie zmienne.

Ale i to jest do obejścia; pozostaje w zasadzie wyłącznie JS działający na podobnej zasadzie, co metoda z sesjami...
Ges
Najsensowniejszym rozwiązaniem jest metoda zaproponowana przez blooregard`a

Ja bym tylko inaczej ją sformułował, ale idea jest słuszna.

Opiera się na secretKey, który trzymasz po stronie PHP`a.

$secretKey = md5("twojetajnehasło");

Tworząc formularz robisz

$random = rand();
$validationValue = md5($random."".$secretKey);

i to wpisujesz do
<input type="hidden" name="randomValue" value="<?=$random?>" />
<input type="hidden" name="validationValue" value="<?=$validationValue ?>" />

Przy odbieraniu takiego formularza robisz

if($_REQUEST['validationValue'] == md5($_REQUEST['randomValue']."".$secretKey))
{
//formularz przeszedł validacje
}
else
{
//hacked
}

Oczywiście pozostawiam jeszcze sprawdzanie czy te wartości wogóle istnieją i zastosowanie zamiast REQUEST odpowiednich innych tabel.
Najważniejsza jest idea bazowania na $secretKey, którego nigdy nie przesyłasz nigdzie w formie widocznej i trzymasz go tylko po stronie kodu.

Oczywiście trzeba uważać, żeby nigdzie go nie printować gdzieś w debug w razie awarii czy coś, bo całe zabezpieczenie bazuje na tym ze klucz ten jest nieznany dla potencjalnego hackera smile.gif

To chyba jedyna pewna technika na walidacje źródła formularza, którą ciężko przełamać.
erix
Przecież można przesłać przez cURL łącznie z tymi polami... Na 99% są boty, które analizują takie formularze.

Dla mnie jedynym takim wyjściem pozostaje dynamiczne dołączanie elementów formularza przez JS, właśnie z solą, ew. negocjacja zawartości tych pól via AJAX.
michaelt
Dzięki wielkie. Wydaje mi się, że metoda Blooregard`a i Ges'a się sprawdzi ( jutro ją zastosuję ). Nie sadzę, żeby temu hakierowi chciało się z nią walczyć (albo czy będzie umiał), a jeśli nawet to już wiem w jakim kierunku rozwinąć zabezpieczenie. 

Napiszę tutaj za jakiś czas czy poskutkowało, a jeśli ktoś z Was ma jeszcze jakiś sposób to chętnie się z nim zapoznam. Thx raz jeszcze.

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.