Avatar billede brian0905 Nybegynder
13. april 2005 - 18:55 Der er 14 kommentarer og
2 løsninger

Hvordan renser jeg min response buffer?

Jeg er ved at kode et lille system i php, da det skal være 100% idiot sikret, må man ikke kunne trykke F5 (reload siden) for så sendes informationer igen til siden (og opretter derved en ny artikel eller lign.), hvordan kan man rense sin response buffer, således man ikke får den der dialog boks når man reloader, hvor der står at kan ikke kan loade siden igen uden at skulle sende informationerne igen... eller er der en anden måde at undgå det på?
Avatar billede voirsous Nybegynder
13. april 2005 - 19:00 #1
Når artikler er oprettet / godkendt sender du brugeren hen til den samme side igen via header();
Avatar billede dennismp Nybegynder
13. april 2005 - 19:04 #2
Du kan ikke bestemme hvordan browseren opfører sig. Så du må lave et tjekt på om du allerede har gemt informationerne.

Et forslag kunne være at bruge session.

1) Når en form submittes, beregner du en md5hash af værdierne
2) du tester om session indeholder en "sidste-md5", i så fald, sammenlign disse to værdier .. Er de ens, er der submittet det samme to gange i træk.
3) du gemmer den ny md5hash i session.
Avatar billede barklund Nybegynder
13. april 2005 - 19:07 #3
Jeg vil også rekommandere voirsous' version. Det er absolut en af de enkleste metoder :)
Avatar billede dennismp Nybegynder
13. april 2005 - 19:10 #4
Ja den er nem, men den løser ikke problemet i alle tilfælde ("100% idiot sikkert") hvis der fx. er begrænset resourcer så kan submitten sagents blive sendt og før der er modtaget response kan man nå at trykke reload.

Det ser indimellem.

(Når dette er sagt, så med mindre jeg laver et lib til forms, så bruger jeg også header() - det er forholdvis sjældent at folk når det)
Avatar billede brian0905 Nybegynder
13. april 2005 - 19:14 #5
Jeg har en side (artikler.php) hvor jeg viser alle artikler. Når brugeren vil oprette en ny artikel bliver han sendt til en opretartikel.php side med en form hvor han skal skrive artiklen. Når han trykker submit ryger han tilbage til den første side (artikler.php) hvor jeg tester for om der er nogle data fra formen på  opretartikel.php. HVis der er data indsætter jeg dem i databasen og viser eller resten af siden (inklusiv den nye artikel). Hvis brugeren nu reloader bliver dataene fra opretartikel.php sendt igen og jeg får en ny artikel magen til den gamle...
Avatar billede brian0905 Nybegynder
13. april 2005 - 19:15 #6
Er løsningen så at have en ny side: doopretartikel.php der indsætter alle data i ddb og så via header() sende folk tilbage til artikler.php ?
Avatar billede barklund Nybegynder
13. april 2005 - 19:18 #7
For eksempel, så får du også pænere og mere adskilt script.
Avatar billede brian0905 Nybegynder
13. april 2005 - 19:20 #8
hmm... jepsen, men jeg får så også lige en ekstra side pr "ting" jeg vil indsætte på min side....
Avatar billede barklund Nybegynder
13. april 2005 - 19:24 #9
Ekstra side? Det følger jeg ikke lige...
Avatar billede brian0905 Nybegynder
13. april 2005 - 19:26 #10
jeg får artikler.php hvor alle artikler er listet, opretartikel.php hvor man opretter en ny artikel og DoOpretArtikel.php der indsætter artiklen i databasen og navigerer brugeren videre til artikler.php.

Det samme får jeg for forum, brugere...osv
Avatar billede barklund Nybegynder
13. april 2005 - 19:52 #11
Tja, problemet er vel ikke så stort. Du kan også lave det en del af opretartikel.php - så den submitter til sig selv. Så kan du også bedre vise fejlmeddelelser og lade brugeren gen-indtaste ting.
Avatar billede brian0905 Nybegynder
13. april 2005 - 20:08 #12
lav lige et svar
Avatar billede barklund Nybegynder
13. april 2005 - 20:30 #13
Nu var voirsous godt nok først med svaret, så vent endelig på ham i stedet, hvis du synes :)
Avatar billede barklund Nybegynder
13. april 2005 - 20:42 #14
Well, tark for points anyway.
Avatar billede olebole Juniormester
13. april 2005 - 20:46 #15
<ole>

dennismp >> To klumper hash fra to forskellige pushere kan sagtens være ens  ;o)

At sammenligne to md5-hashes er absolut heller ikke nogen 100%-garanti. Er de to hashes ens, er det ikke nødvendigvis udtryk for, de to oprindelige strenge er ens. Det er sandsynligt - men ikke sikkert  :)

/mvh
</bole>
Avatar billede dennismp Nybegynder
13. april 2005 - 21:53 #16
Det er jeg klar over, men ser det for temmelig usandsynlig at een bruger får 2 ens md5-hashes i træk  i sammme session - ved tilfældighed. Der hvor man skal passe på (tænke sig om) er om brugeren legitimt kan submitte det samme to gange.  Men hvis man syntes det er et problem, så kan man da bare gemme hele data-sættet istedet.

"Temmelig usandsynlig" skal forstås på den måde at header-løsningen har en meget meget større sandsynlighed for at give problemet. Men det er lidt omstændigt at lave hver gange - med mindre man har lavet et library/framework til det - som man genbruger.

Det samme kunne jo også laves med en simpel tæller. Sættes til 0 ved session-start og så gemmes i hver form. Når formen submittes kan man tjekke de to tal op imod hinanden. Hvis alt er ok, tælles værdien op (dermed gør "gamle" form-data'en ugyldig for evt efterfølgende submits). Ideen er jo den samme. Man gør data ugyldigt når data er gemt.

Men der er stadig race-conditions. Og en række faktorer i koden der kan give problemer.

Men jeg kan da lave en side, så er du velkommen til at submitte løs :-)

Der er jo også en anden væsenlig forskel. "Mit" forslag går på hvordan man kan håndtere problemet når det sker. Header() håndterer ikke problemet, men undgår det. Hvis der resubmittes før header() bliver udført af browseren, så har vi samme programstilling. Det er bare minimeret hvor tit det sker - og med meget lidt kode.

(olebole, jeg ved godt at du sandsynligvis ved det meste af dette, men det er ligeså meget skrevet til andre der måtte læse dette senere - selvom de færreste søger efter svar :( )
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester