Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Formularz - zabezpieczenie, Jak sprawdzić, czy dane pochodzą z formularza na stronie.
michaelt
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.01.2009
Skąd: Schelluinen | Nederland

Ostrzeżenie: (0%)
-----


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?




Go to the top of the page
+Quote Post
Matte
post
Post #2





Grupa: Zarejestrowani
Postów: 35
Pomógł: 7
Dołączył: 4.04.2009
Skąd: Sosnowiec

Ostrzeżenie: (0%)
-----


$_SERVER['HTTP_REFERER'] Przekazuje z jakiej strony nadeszło odwołanie, jednak to można nadal oszukać.
Go to the top of the page
+Quote Post
michaelt
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.01.2009
Skąd: Schelluinen | Nederland

Ostrzeżenie: (0%)
-----


Tak też już próbowałem, ale rzeczywiście bardzo prosto można to oszukać (IMG:style_emoticons/default/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 ).

Go to the top of the page
+Quote Post
blooregard
post
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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.
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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...
Go to the top of the page
+Quote Post
Ges
post
Post #6





Grupa: Zarejestrowani
Postów: 61
Pomógł: 9
Dołączył: 22.02.2008

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)

To chyba jedyna pewna technika na walidacje źródła formularza, którą ciężko przełamać.

Ten post edytował Ges 18.11.2009, 23:01:12
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
michaelt
post
Post #8





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.01.2009
Skąd: Schelluinen | Nederland

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 10:31