![]() |
![]() |
![]()
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 ![]() Serdecznie pozdrawiam -------------------- serwiswww.pl
|
|
|
![]() |
![]()
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.
|
|
|
![]()
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.
-------------------- |
|
|
![]()
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
|
|
|
![]()
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:
Projektujemy je tak:
-------------------- "Sumienie mam czyste, bo nieużywane."
|
|
|
![]()
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... -------------------- |
|
|
![]()
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 ![]() Apeluje o dalsze umieszczanie swoich pomyslow... Pozdrawiam -------------------- serwiswww.pl
|
|
|
![]()
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.
-------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 13:45 |