Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zabezpieczenie przed WSTECZ i ODŚWIEŻ
Forum PHP.pl > Forum > Przedszkole
Kshyhoo
Witam po raz kolejny. Chciałbym uzyskać pomoc w kwestii zabezpieczenia danych w formularzu przed przeładowaniem i przyciskiem wstecz (wiem, że nie da się zablokować całkowicie). Znalazłem na to 3 sposoby - cookie, sesje i nagłówek. Niestety, nie umiem tego połączyć z moim wielostopniowym formularzem... Pomoże ktoś mądry?
  1. <?php
  2. if (isset($_POST['krok']) && $_POST['krok'] == "1") {
  3.  
  4. // tu kontrola wypełnienia w js
  5.  
  6. echo "<center><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST' onSubmit='return testuja(this);'>";
  7.  
  8. echo "<input type='hidden' name='krok' value='2'>\n";
  9. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  10.  
  11. } elseif (isset($_POST['krok']) && $_POST['krok'] == "2") {
  12.  
  13. echo "<center><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST' onSubmit='return checkRadios(this);'>";
  14.  
  15. // tu kontrola wypełnienia w js
  16.  
  17. echo "<input type='hidden' name='krok' value='3'>";
  18. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  19.  
  20. } elseif (isset($_POST['krok']) && $_POST['krok'] == "3") {
  21.  
  22. echo "<center><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST' onSubmit='return testujb(this);'>";
  23.  
  24. // tu kontrola wypełnienia w js
  25.  
  26. echo "<input type='hidden' name='krok' value='4'>\n";  
  27. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  28.  
  29. } else {
  30.  
  31. echo "<hr class='hr' /><form name='generator' action='".basename($_SERVER['PHP_SELF'])."' method='POST'>";
  32.  
  33. echo "<input type='hidden' name='krok' value='1'>\n";  
  34. echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  35.  
  36. }
  37. ?>
erix
A czemu nie korzystasz z sesji?
Kshyhoo
Eh, jeżeli chodzi o pojedynczy formularz, umiem to zrobić. Ten w kilku stopniach wywala mi notice i nie robi tego, co chcę.
bemol
a czemu nie robisz sobie na $_GET i nie lecisz switch'em? ja tak zawsze kroki robiłem. oszczędzisz nie potrzebnych hiddenów, a adres mozesz zamaskowac modrewrite
Kshyhoo
Cytat(bemol @ 5.07.2009, 10:38:19 ) *
a czemu nie robisz sobie na $_GET i nie lecisz switch'em? ja tak zawsze kroki robiłem. oszczędzisz nie potrzebnych hiddenów, a adres mozesz zamaskowac modrewrite

A możesz jakiś przykład dać, nie jestem zaawansowany w php...
bemol
  1. <?php
  2. switch ($_GET['krok']) {
  3.  
  4. case 1: { // 1 - wartość tablicy $_GET['krok']
  5.  
  6. echo '<form action="skrypt.php?krok=2" method="post">
  7. <input />
  8. <input />
  9. <input />
  10. </form>';
  11.  
  12. break;}
  13.  
  14. case 2: { // 2 - wartość tablicy $_GET['krok']
  15.  
  16. ...
  17.  
  18. break;}
  19.  
  20. // itd...
  21.  
  22. default: { // wartość domyślna
  23.  
  24. echo '<form action="skrypt.php?krok=1" method="post">
  25. <input />
  26. <input />
  27. <input />
  28. </form>';
  29.  
  30. break;}
  31. }
  32. ?>


Więcej: http://pl.wikibooks.org/wiki/PHP/Instrukcja_switch
i
http://pl.php.net/manual/en/control-structures.switch.php
Kshyhoo
Właśnie zacząłem przerabiać na switch. Na razie bez zmian. Zastosuję się do Twoich propozycji. Instrukcję switch znam dobrze, wszystkie pliki inkludowane mam na ten funkcji. Można zobaczyć efekty mojej pracy tu. Problem widoczny najbardziej w kroku 4 i 5...

EDIT: właśnie skończyłem - niestety, efekt identyczny ;(
bemol
dodaj w każdym 'case' :
1.
  1. <?php
  2. if (!isset($_SESSION['krok']) or empty($_SESSION['krok'])) $_SESSION['krok'] = 1; //w zależności który krok jest
  3. else $_SESSION['krok']++;
  4. ?>

2.
  1. <?php
  2. if ($_SESSION['krok'] > $_GET['krok'];) {
  3. // ktos wcisnal wstecz
  4. }
  5. else {
  6. // jest poprawnie
  7. }
  8. ?>
Kshyhoo
Zrobiłem tak:
  1. <?php
  2. case 4:{
  3.              if (!isset($_SESSION['krok']) or empty($_SESSION['krok'])) $_SESSION['krok'] = 4;
  4.              else $_SESSION['krok']++;
  5.  
  6.              echo "<center><form name='generator' action='herb1.php?krok=5' method='POST'>";
  7.  
  8.              if ($_SESSION['krok'] > $_GET['krok']) { // ktos wcisnal wstecz
  9.                      include('include/krok3.php');
  10.              }
  11.              else { // jest poprawnie
  12.                       include('include/krok4.php');
  13.                }
  14.  
  15.              echo "<input type='hidden' name='krok' value='5'>\n";
  16.              echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  17. break;}
  18. ?>

Ale efekt ten sam...
Pawel_W
  1. <?php
  2. case 4:
  3.             if (!isset($_SESSION['krok']) or empty($_SESSION['krok'])) $_SESSION['krok'] = 4;
  4.             else $_SESSION['krok']++;
  5.  
  6.             echo "<center><form name='generator' action='herb1.php?krok=5' method='POST'>";
  7.  
  8.             if ($_SESSION['krok'] > $_GET['krok']) { // ktos wcisnal wstecz
  9.                     include('include/krok3.php');
  10.             }
  11.             else { // jest poprawnie
  12.                      include('include/krok4.php');
  13.               }
  14.  
  15.             echo "<input type='hidden' name='krok' value='5'>\n";
  16.             echo "<input type='submit' name='dalej' value='Idź dalej'></form>";
  17. break;
  18. ?>
Kshyhoo
Efekt dokładnie taki sam... Problem jest w tym, że po WSTECZ, również $_GET na wartość pomniejszoną o 1...

Cytat(erix @ 4.07.2009, 22:33:57 ) *
A czemu nie korzystasz z sesji?

Jakieś szczegóły?
erix
Dlaczego wszystkie dane przepychasz przez użytkownika?

Poczytaj kurs PHP o sesjach.
Kshyhoo
Jak dotąd nie znalazłem sposobu na efektywne zabezpieczenie się przed przyciskiem WSTECZ... Nagłówek, sesje i cookie nic nie dały, bo i tak przetwarza mi te same dane. Z ODŚWIEŻ jakoś sobie radzę...
Przewałkowałem Google, najwięcej wniósł ten temat. Znalazłem też takie coś. Może ktoś mi podpowiedzieć, jak to zastosować?



@erix, Ty mnie chyba naprawdę [cenzura] nie lubisz? Już przecież wiesz, że poznałem mechanizm sesji... ale do rozwiązania problemu, z którym się zgłosiłem sama znajomość sesji nie wystarczy. W miesiąc nie sposób poznać php (z przeprowadzką na głowie). Po za tym, chyba wybrałem odpowiedni dział? Może niech powstanie kolejny (proponuję "żłobek"), gdzie towarzystwo będzie bardziej przychylne.
erix
Cytat
zgłosiłem sama znajomość sesji nie wystarczy

Owszem, wystarczy. Gdybyś poznał sesje, byś także poczytał o ataku zwanym CSRF i o metodach przed zabezpieczeniem przed nim. Jest tam coś takiego zwanego tokenem, jeśli będziesz dla każdego żądania generował unikalny, to będziesz miał zabezpieczenie także przed wtecz/dalej.

Cytat
@erix, Ty mnie chyba naprawdę [cenzura] nie lubisz?

Nie lubię lenistwa.
Kshyhoo
Cytat(erix @ 6.07.2009, 22:23:48 ) *
Nie lubię lenistwa.

Kiedyś mieliśmy okazję na ten temat rozmawiać. Odpuść sobie te pieprzenie, bo lenistwa nie może mi nikt zarzucić.

Co co "coś takiego zwanego tokenem, jeśli będziesz dla każdego żądania generował unikalny", to robiłem:
  1. <?php
  2. <input type='hidden' name='id' value='".uniqid()."'>
  3. ?>

i:
  1. <?php
  2. if (isset($dalej) and $_POST["id"]==$_SESSION["id"]) {
  3. echo "";
  4. }
  5. if (isset($dalej) and $_POST["id"]<>$_SESSION["id"]) {
  6. $_SESSION["id"] = $_POST["id"];
  7. echo $dalej;
  8. }
  9. ?>

i ODŚWIEŻ owszem, na ale WSTECZ nie działało, bo przecież i tak był ten sam id...

Sądząc po linku, który wkleiłem wcześniej, to jest spory problem i dla profesjonalistów.
erix
Bo przed wygenerowaniem tokena musisz go wrzucić do sesji i potem przy załadowaniu sprawdzasz, czy już w niej jest. Jeśli nie ma - wiesz co robić.

Cytat
Sądząc po linku, który wkleiłem wcześniej, to jest spory problem

Nie jest, wystarczy ruszyć głową.

Cytat
Odpuść sobie te pieprzenie

Chyba Ci się pomyliły pełnione funkcje... Nie Ty tu jesteś od pouczania i ja Cię pouczam, że z takim słownictwem daleko nie zajedziesz. To nie jest Twoje podwórko.
Kshyhoo
Opierałem się na tym artykule,

Cytat(erix @ 6.07.2009, 22:52:35 ) *
To nie jest Twoje podwórko.

Twoje również nie. Jesteś tu tylko moderatorem a nie królem. Masz coś do powiedzenia w temacie (czyt. chcesz pomóc), zapraszam. Jeżeli nie, proszę - nie wypowiadaj się.

PS. Za niecenzuralne słowo przepraszam. Poniosło mnie - bo nie czuję się leniem.
erix
Cytat
Opierałem się na tym artykule,

Wątpię, aby ktoś miał wykupiony abonament w tym serwisie oprócz Ciebie.

Cytat
Twoje również nie. Jesteś tu tylko moderatorem a nie królem. Masz coś do powiedzenia w temacie (czyt. chcesz pomóc), zapraszam. Jeżeli nie, proszę - nie wypowiadaj się.

Moim zadaniem jest tu pilnowanie porządku. Jeśli Ci się wydaje inaczej - zawsze możesz sprawę zgłosić do administratora. Poza tym, odpowiadam w każdym poście na temat, więc w czym problem?

Cytat
PS. Za niecenzuralne słowo przepraszam. Poniosło mnie - bo nie czuję się leniem.

Trzymaj nerwy na wodzy. To nie jest miejsce na "noszenie".

A co do tematu: zapomniałem jeszcze dodać o nagłówkach bez cache'owania.
Kshyhoo
Cytat(erix @ 6.07.2009, 23:15:04 ) *
A co do tematu: zapomniałem jeszcze dodać o nagłówkach bez cache'owania.

To pierwsza rzecz, którą zrobiłem. Na WSTECZ marna rada...
erix
Bo przeglądarka wczytuje stronę z pamięci. Jeśli chcesz, aby strona była naprawdę wczytywana ponownie, to stosuj tokeny i najlepiej SSL (wówczas przeglądarki inaczej traktują zawartość - tzn. nie cache'ują tak stron).
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.