![]() |
![]() ![]() |
![]() |
![]()
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? |
|
|
![]()
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ć.
|
|
|
![]()
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 ). |
|
|
![]()
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. |
|
|
![]()
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... |
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 10:31 |