Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP i formularze
Forum PHP.pl > Forum > PHP
likemandrake
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
starach
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.
Ludvik
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.
likemandrake
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
Kicok
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. ?>
Ludvik
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...
likemandrake
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
Ludvik
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.
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.