Blokowanie wielokrotnego wykonania


Oglądasz archiwalną wersję tematu "Blokowanie wielokrotnego wykonania" z forum pl.comp.www.server-side


KK - 3 Sie 2005, 03:51

Witam

Administruje serwisem, który działa w dość dużej firmie (zlecenia,
urlopy itp). Całość działa na wieloprocesorowej maszynie z
zainstalowanymi: Win2003 + IIS + PHP + MSSQL Serwer.
Do rozmaitych funkcji systemu, użytkownicy mają dostęp poprzez
przeglądarkę internetową.
Od jakiegoś czasu, walczę z problemem "odświeżania". Chodzi mi o to, jak
zablokować albo odświeżanie stron (z tego co wiem, jest to ciężko) albo
(to by było dobre rozwiązanie) unioemożliwić dwukrotne wykonanie teego
samego zapytania.
Zdarza się ostatnio coraz częściej, że ktoś wpisze zlecenie, zamówienie
czy jakieś inne informacje, doda, po czym odświeży stronę - no i mamy
dwa zamówienia, trzy urlopy itd.
Myślałem nad rozwiązaniem tego problemu z zastosowaniem sesji PHP, ale
nie wiem czy jest to najszczęśliwsze rozwiązanie. Może lepiej skorzystać
z mechanizmów (jakich?) MS SQLa ?

Z góry dziękuje za wszelkie pomocne informacje i uwagi.

Pozdrawiam serdecznie - Krzysztof.



syku - 3 Sie 2005, 04:18

Z góry dziękuje za wszelkie pomocne informacje i uwagi.

Pozdrawiam serdecznie - Krzysztof.



Redirect po wykonaniu zapisu zalatwi sprawe

Pozdrawiam
syku


KK - 3 Sie 2005, 04:43

| Z góry dziękuje za wszelkie pomocne informacje i uwagi.

| Pozdrawiam serdecznie - Krzysztof.

Redirect po wykonaniu zapisu zalatwi sprawe

Pozdrawiam
syku



W sumie proste i chyba skuteczne rozwiązanie
Wcisnąć F5 pomiędzy zapytaniem do bazy a "redajrektem" nie za bardzo się
da, bo wszystko wykonywane jest wtedy po stronie serwera

A co z funkcją "COFNIJ" ?

Wykona ponownie to samo :-P

KK


syku - 3 Sie 2005, 05:32

W sumie proste i chyba skuteczne rozwiązanie
Wcisnąć F5 pomiędzy zapytaniem do bazy a "redajrektem" nie za bardzo się
da, bo wszystko wykonywane jest wtedy po stronie serwera

A co z funkcją "COFNIJ" ?

Wykona ponownie to samo :-P



rozumujac w ten sposob powinienes zabezpieczyc aplikacje przed dwukrotnym
wypełnieniem tego samego formularza bo tez beda dwie kopie...



Sergiusz Różański - 3 Sie 2005, 09:29


| W sumie proste i chyba skuteczne rozwiązanie
| Wcisnąć F5 pomiędzy zapytaniem do bazy a "redajrektem" nie za bardzo się
| da, bo wszystko wykonywane jest wtedy po stronie serwera

| A co z funkcją "COFNIJ" ?

| Wykona ponownie to samo :-P

rozumujac w ten sposob powinienes zabezpieczyc aplikacje przed dwukrotnym
wypełnieniem tego samego formularza bo tez beda dwie kopie...



wpisanie usera z premedytacją 2x tej samej treści w ten sam formularz,
a bezwiedne wysłanie dwukrotne to chyba 2 inne sprawy nie?
chyba najprościej dla każdego formularza generować losowy token w hide, zapisywać
go wraz z wykorzystaniem, tokeny zapisane opróźniać co dobe/tydzień/miesiąc/nigdy ;)
Więc każdy wygenerowany formularz ma własne ID, po submit to ID leci do magazynu
bazy/katalogu/czegoś tam, jak przylatuje submit to oglądasz ten magazyn czy
formularz już był uruchomiony i jak tak to error.


syku - 4 Sie 2005, 03:16

| rozumujac w ten sposob powinienes zabezpieczyc aplikacje przed dwukrotnym
| wypełnieniem tego samego formularza bo tez beda dwie kopie...

wpisanie usera z premedytacją 2x tej samej treści w ten sam formularz,
a bezwiedne wysłanie dwukrotne to chyba 2 inne sprawy nie?



uzyszkodnik musial by bezwiednie wcisnac przycisk wstecz (raczej proste
szczegolnie z wieloprzyciskowymi myszkami) a pozniej bezwiednie ponownie
wcisnac przycisk wyslij...

pomysl z tokenem jak najbardziej ok
mozna tez pobawic sie z obsluga cache
np w ASP:

Response.Expires = 0
Response.ExpiresAbsolute = Now ()-1
Response.AddHeader "pragma", "no-cache"
Response.AddHeader "cache-control", "private"
Response.CacheControl = "no-cache"

zalatwia sprawe calkowicie - po wcisnieciu cofnij formulaz jest czysty.
Wystarczy znalezc odpowiedniki powyzszego kodu dla PHP.

Pozdrawiam
syku


Sergiusz Różański - 4 Sie 2005, 04:05


| rozumujac w ten sposob powinienes zabezpieczyc aplikacje przed dwukrotnym
| wypełnieniem tego samego formularza bo tez beda dwie kopie...

| wpisanie usera z premedytacją 2x tej samej treści w ten sam formularz,
| a bezwiedne wysłanie dwukrotne to chyba 2 inne sprawy nie?

uzyszkodnik musial by bezwiednie wcisnac przycisk wstecz (raczej proste
szczegolnie z wieloprzyciskowymi myszkami) a pozniej bezwiednie ponownie
wcisnac przycisk wyslij...

pomysl z tokenem jak najbardziej ok



tylko problem ma głębsze podłoże, sytuacja mniejwięcej taka, że
user klika submit, przeglądarka buduje zapytanie i wysyła je do
servera, tam skrypt wykonuje to zapytanie, powiedzmy zajmuje mu to
sekunde, robi różne fikołki na bazie i chce odesłać strone z
potwierdzeniem wykonania operacji, oddaje ją serverowi www i się
kończy. W tym czasie server www gubi połączenie z przeglądarką,
bo powiedzmy ktoś gdzieś po drodze przeładował router i tabela
contraków poszła w kosmos. Przeglądarka niby zwisa, user po
minucie (to zależy od cierpliwości usera) klika submit 2 raz,
przeglądarka zaczyna nową sesje ze serverem, znowu skrypt i
tym razem mamy wszystko OK, ale skrypt na tych samych danych
wykonał się dwukrotnie.
O ile mamy w treści zapytania jakieś dane unikatowe, tą
powtórność możemy detekować, w innym przypadku nie i trzeba
je sztucznie tworzyć.


Bartlomiej Czardybon - 4 Sie 2005, 08:00



| rozumujac w ten sposob powinienes zabezpieczyc aplikacje przed dwukrotnym
| wypełnieniem tego samego formularza bo tez beda dwie kopie...

| wpisanie usera z premedytacją 2x tej samej treści w ten sam formularz,
| a bezwiedne wysłanie dwukrotne to chyba 2 inne sprawy nie?

| uzyszkodnik musial by bezwiednie wcisnac przycisk wstecz (raczej proste
| szczegolnie z wieloprzyciskowymi myszkami) a pozniej bezwiednie ponownie
| wcisnac przycisk wyslij...

| pomysl z tokenem jak najbardziej ok

tylko problem ma głębsze podłoże, sytuacja mniejwięcej taka, że
user klika submit [...]
Przeglądarka niby zwisa, user po minucie (to zależy od cierpliwości usera)
klika submit 2 raz,



Rozwiazaniem tego problemu sa tzw. tickety. Generujac formatke dla usera
zapisujesz do bazy ticket i w formatce umieszczasz go w polu hidden. Po
zasubmitowaniu formatki zaznaczasz ticket jako niewazny (zuzyty). Wykonujesz
operacje tylko jesli ticket jest wazny.

Pozdrowka,


Sergiusz Różański - 4 Sie 2005, 08:14



| | rozumujac w ten sposob powinienes zabezpieczyc aplikacje przed dwukrotnym
| | wypełnieniem tego samego formularza bo tez beda dwie kopie...

| wpisanie usera z premedytacją 2x tej samej treści w ten sam formularz,
| a bezwiedne wysłanie dwukrotne to chyba 2 inne sprawy nie?

| uzyszkodnik musial by bezwiednie wcisnac przycisk wstecz (raczej proste
| szczegolnie z wieloprzyciskowymi myszkami) a pozniej bezwiednie ponownie
| wcisnac przycisk wyslij...

| pomysl z tokenem jak najbardziej ok

| tylko problem ma głębsze podłoże, sytuacja mniejwięcej taka, że
| user klika submit [...]
| Przeglądarka niby zwisa, user po minucie (to zależy od cierpliwości usera)
| klika submit 2 raz,

Rozwiazaniem tego problemu sa tzw. tickety. Generujac formatke dla usera
zapisujesz do bazy ticket i w formatce umieszczasz go w polu hidden. Po
zasubmitowaniu formatki zaznaczasz ticket jako niewazny (zuzyty). Wykonujesz
operacje tylko jesli ticket jest wazny.



czytałeś cały wątek czy tylko ten 1 post :) bo przecież o tym pisałem,
tylko odwrotnie, zapisujesz zużyty ticket (token), a nie wygenerowany,
przymując zasade że generuje się więcej formularzy niż akceptuje, to
ma sens.


tomek gomek - 5 Sie 2005, 08:20

Witam

Administruje serwisem, który działa w dość dużej firmie (zlecenia,
urlopy itp). Całość działa na wieloprocesorowej maszynie z
zainstalowanymi: Win2003 + IIS + PHP + MSSQL Serwer.
Do rozmaitych funkcji systemu, użytkownicy mają dostęp poprzez
przeglądarkę internetową.
Od jakiegoś czasu, walczę z problemem "odświeżania". Chodzi mi o to, jak
zablokować albo odświeżanie stron (z tego co wiem, jest to ciężko) albo
(to by było dobre rozwiązanie) unioemożliwić dwukrotne wykonanie teego
samego zapytania.
Zdarza się ostatnio coraz częściej, że ktoś wpisze zlecenie, zamówienie
czy jakieś inne informacje, doda, po czym odświeży stronę - no i mamy
dwa zamówienia, trzy urlopy itd.
Myślałem nad rozwiązaniem tego problemu z zastosowaniem sesji PHP, ale
nie wiem czy jest to najszczęśliwsze rozwiązanie. Może lepiej skorzystać
z mechanizmów (jakich?) MS SQLa ?

Z góry dziękuje za wszelkie pomocne informacje i uwagi.

Pozdrawiam serdecznie - Krzysztof.



Nie można po prostu nie zapisywać zduplikowanych rekordów?
Przecie nie moge isc na urlop dwa razy w *tym samym* czasie na przyklad.


ASP: błąd wykonania ''800a0046' - Brak uprawnień
Wykonam kazda strone www, baner, reklame, logo, folderek
PHP na SSLu - pobieranie skryptu zamiast wykonania go
POL Wizards - projekty i wykonanie WWW
Zlece wykonanie systemu + dalsza administracje
szukam wykonawcy skryptów tworzących pdf-y
Ile srednio kosztuje wykonanie strony
  • dom aukcyjny wino
  • pies bigle
  • rianbown com
  • misje i inne takie wydzielone z
  • obuwie medyczne producent
  • ustawienia gprs siemens sxg75
  • zaslony z nitek
  • nokia mp3 amr
  • hc punk d i y show na squacie m9 w sosnowcu
  • Kolekcja tematów z for dyskusyjnych ; Start