Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP i formularze, Różne sposoby, jak ominąć akcję ponownego wysyłania formularzy
likemandrake
post
Post #1





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Witam!

Temat pewnie nie raz był poruszany, ale pomyślałem, żeby to wszystko zgromadzić w tym jednym miejscu.

Otóż tak jak w temacie, chodzi o różne sposoby aby zabezpieczyć się przed ponownym wykonaniem akcji wysyłania formularzy (zwykle przez użycie przycisków odśwież i wstecz w panelu nawigacyjnym przeglądarki).

Dla przykładu, gdy w przeglądarce firefox klikniemy na przycisk wstecz, wyskoczy pytanie, czy ponownie wysłać dane POSTDATA. Aby poprzednia strona się załadowała, trzeba odpowiedzieć twierdząco, no i w tym czasie następuje to co nie powinno i jeśli nie zareagujemy odpowiednio na ten proceder, powiedzmy w bazie danych znajdą się zduplikowane dane lub jeśli komuś sprawia to zabawę wstawi masę nie potrzebnych wpisów.

Drugim przykładem może też być odświeżanie strony po wysłaniu formularza, co też może być powodem duplikowania danych.

Już nie wspomnę jakie szkody mogą wyrządzić różne automaty stworzone do tego typu celów...

Sposobów na zabezpieczenie się przed tym jest wiele, czy to przekierowania, czy nadawanie specjalnych jednorazowych identyfikatorów na daną akcję, pragnę jednak, aby każdy z was w miare możliwości przedstawił swoje obserwacje i doświadczenia w tym kierunku, a każdy zainteresowany tym tematem mógłby znaleźć coś dla siebie smile.gif

Serdecznie pozdrawiam


--------------------
serwiswww.pl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
starach
post
Post #2





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Zabezpieczenia przed floodowaniem ja mam zrobione na sesjach i nie ma z tym większego problemu a jak jakiś użytkownik walnie na chama przeczekując timeout anty-flooda kasuje z wiersza poleceń z bazy i usuwam konto.
Go to the top of the page
+Quote Post
Ludvik
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Ochronę przed duplikacją danych wysyłanych przez formularze implementuje się za pomocą tokena synchronizującego. Zapisujesz w sesji użytkownika i formularzu token. Użytkownik wysyła żądanie, zapisujesz dane i zmieniasz token w sesji. Jeżeli dane zostaną wysłane 2 razy, to za drugim tokeny będą niezgodne.


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





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Wezmy pod uwage taki przyklad.

Mamy sklep internetowy i kupujemy jakis produkt.
Klikamy na link ktory ma wrzucic produkt do koszyka, zaraz po zaladowaniu strony mozemy sobie kliknac na odswiez, no i w tym momencie produkt moze zostac ponownie dopisany do koszyka.

W takim wypadku token synchronizujacy napewno nie moze byc uzyty.
Mysle ze z tego sa rozne wyjscia, np. uzycie wlasnie sesji w php.

Czy zna moze ktos inne wyjscia z tego typu sytuacji?

Dla kazdego typu sytuacji jednak sa rozne inne sposoby, do rejestracji inny, do klikania na link inny, itp. itd.

Pozdrawiam

Prosze dodawać swoje pomysły i doświadczenia do tematu

Ten post edytował likemandrake 3.06.2007, 15:06:15


--------------------
serwiswww.pl
Go to the top of the page
+Quote Post
Kicok
post
Post #5





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Najprostszy sposób:

Zamiast projektować stronki tak:
  1. <?php
  2.  
  3. if( isset( $_POST['pole'] ) )
  4. {
  5. // operuj na danych przesłanych metodą POST
  6.  
  7.  
  8. // Wyświetl jakieś informacje po wysłaniu formularza
  9. }
  10. else
  11. {
  12. // Wyświetlaj formularz
  13.  }
  14.  
  15. ?>



Projektujemy je tak:
  1. <?php
  2.  
  3. if( isset( $_POST['pole'] ) )
  4. {
  5. // operuj na danych przesłanych metodą POST
  6.  
  7.  
  8. header( 'Location: adres_strony_ktora_chcemy_wyswietlic_po_przetworzeniu_danych_z_formula
    rza.php'
     );
  9. exit();
  10. }
  11.  
  12.  
  13. // Wyświetlaj formularz
  14.  
  15. ?>


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Ludvik
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
W takim wypadku token synchronizujacy napewno nie moze byc uzyty.

A niby dlaczego token miałby być zły? To jest najbardziej sensowne wyjście... Przecież napisałem, że przy utworzeniu formularza generujesz token, zapisujesz go w sesji i dodajesz go jako ukryte pole. Użytkownik wysyła ten formularz i dzieje się tak:
- sprawdzamy token - zgadza się
- wykonujemy modyfikacje danych
- zmieniamy/usuwamy token
Użytkownik naciska odśwież:
- sprawdzamy token - token jest inny/nie ma tokenu
- wyrzucamy błąd

Cytat
Dla kazdego typu sytuacji jednak sa rozne inne sposoby, do rejestracji inny, do klikania na link inny, itp. itd.

Zdziwiłbyś się, jakim elastycznym narzędziem jest token synchronizujący. Ochrona przed duplikacją danych nie jest jego jedynym zastosowaniem...


--------------------
Go to the top of the page
+Quote Post
likemandrake
post
Post #7





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Hmmmm, troszkę poruszyłem w pewnym momencie treść trochę odbiegającą od tematu tego posta.
Nawiązałem trochę do innego przypadku, nie związanym raczej z formularzami. Chodziło tym razem o klikanie na link, powiedzmy z listy produktów, następuje przeładowanie strony, powiedzmy zostaje dodany produkt do listy zakupionych, w tym momencie jak bedziemy odświeżać stronę, zostają dodane te same produkty, czyli następuje duplikowanie danych.

Ale to co mowisz, z tym tokenem, to jednak nie bedzie problemu dodac taki token do linku i przechwycic go z tablicy $_GET.

Jest to naprawdę dobry pomysł, teraz to zauważyłem, wcześniej troche pomyliło mi się z innym typem zabezpieczenia, w kazdym razie zwracam honor smile.gif

Apeluje o dalsze umieszczanie swoich pomyslow...

Pozdrawiam


--------------------
serwiswww.pl
Go to the top of the page
+Quote Post
Ludvik
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Nie będzie problemu poprzez GET, ale jest to trochę niewygodne, gdyż trzeba dopisywać do linków. Do "delikatnych" operacji, wymagających tokenu lepiej wprowadzić formularz wysyłany metodą POST.


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 13:45