ugrás a tartalomhoz

Session gond Chrome-ban ezredszerre

mz82 · 2013. Ápr. 17. (Sze), 18.58
Sziasztok!

A lenti kódot használom egy űrlap F5 elleni védelmére. Olyan módon, hogy a létrejött véletlenszerű kódot az űrlap egy hidden elemébe teszem, majd a form elküldése után összehasonlítom a kapott értéket a $_SESSION[f5_disable] értékével.

Ez minden böngészőben tökéletesen működik is, csak Chrome normál üzemmódjában nem, mivel ott látszólag egynél többször lefut a kód, ami miatt nyilván változik a session értéke. Chrome inkognító módban szintén rendben működik! Ötlet?

Nem használok Rewrite-ot, Redirect-et, van favicon.ico-m, a megjelenített oldal minden eleme 200-as, a session_start() az index.php-m legelején van, a chrome konzolja üres, hibátlan. Elfogytam az ötletekből. Köszi a segítséget, ha volna ötlet!

Az nem megoldás, hogy minden plugint kapcsoljak ki, mivel a látogatót sem kérhetem erre! :-) És nem szeretnék javascriptet sem használni erre a célra.

function f5_generate(){
      $chars="abcdefhjkmnpqrstuxy345789";
      $str="";
      for ($i=0;$i<6;$i++){
          $rand=rand(0,strlen($chars)-1);
          $str.=$chars[$rand];
      }

      $_SESSION[f5_disable]=$str;
   }
 
1

Meg tudod nézni a forgalmat,

Poetro · 2013. Ápr. 17. (Sze), 19.33
Meg tudod nézni a forgalmat, hogy esetleg nem tölti be kétszer az index.php-t? Mert mondjuk elfelejtetted kitölteni egy img elem src attribútumát. Elég ha megnézed a Network panelt a böngészőben, és látni fogod, milyen tartalmakat próbál betölteni.
2

Minden 200, Ok

mz82 · 2013. Ápr. 17. (Sze), 21.22
Mint fent írtam, minden elem betöltődik az oldalon (a Network panelon minden elem status 200 OK). Szerintem nem fogom tudni megoldani. :-( Mennyire elegáns form újraküldés kiküszöbölésére, ha header-el újratöltöm/átirányítom az oldalt sikeres form küldés után? Template-el dolgozom, szóval elvileg a böngésző nem kezdi összeeszkábálni az oldalt a form feldolgozása közben.
3

Betöltődik

Poetro · 2013. Ápr. 17. (Sze), 22.23
Nem azt mondtam, hogy nem töltődik be, hanem valami oknál fogva az index.php mondjuk kétszer töltődik be.
4

Elegáns?

Pepita · 2013. Ápr. 17. (Sze), 22.33
1. A formot elküldik: megy "hozzád" egy POST kérés.
2. Te feldolgozod: csinálsz az adatokkal valamit szerver oldalon.
3. Visszaküldesz egy választ: ez egy tetszőleges (HTML) tartalom, hogy ne üres semmit lásson a Júzer.

Tehát mi az újraküldés? Frissítés? Nem értem:
a böngésző nem kezdi összeeszkábálni az oldalt a form feldolgozása közben
Csak a 3. után tud eszkábálni a böngésző, mert addig nincs miből. Addigra viszont kész a feldolgozás. Ennek szerintem semmi köze a template-hez.

Sajnos nem tudom, hogy neked a Chrome mit csinál. Nemrég volt egy látogatói visszajelzésem, hogy (szintén Chrome-mal) bejelentkezés után "fehér semmi" van. Viszont bármit próbáltam az enyémen állítani, nem sikerült reprodukálnom a hibát (mondjuk infóm is kb csak ennyi volt, a saját beállításait sem tudta, nemhogy plugin-ek létét-állapotát). Nekem volt a mutatványban redirect is (úgy tűnt, hogy ezt nem hajtja végre), de más szituban (pl. komment post) rendesen működött neki is, csak login után nem. Gondolom ez semennyit sem segít...
5

...a 3. pontod után

mz82 · 2013. Ápr. 17. (Sze), 22.58
Igen, a 3. pontod után nyom a user egy F5-öt, vagy egy frissítés gombot és azzal újra elküldi a form adatait. Ugye ezt szeretném elkerülni.

Azt pedig nem jelenteném ki, hogy csak a 3. után léphet be a böngésző, mert a mai napig rengeteg ilyen php kódot látni pl:

<html>
<head>
...
</head>
<body>
<?php 
if ($_REQUEST[akarmi]){
  echo $_REQUEST[akarmi];
}
?>
</body>
Szóval szerintem van az a szitu, amikor dolgozik a böngésző form feldolgozás közben is! :-) Egy template-s megoldásnál meg elvileg egyben tolom ki a böngészőnek a kész html kódot. De ebbe ne menjünk bele.

Az elegáns alatt azt értettem, hogy van e jobb javaslat, ha szerver oldalon szeretném levédeni az űrlap utólagos újraküldését. Tehát nem egy egyszerű "választ" küldök a usernek, hanem a válaszba beiktatok egy header('Location: akarmi.php') átirányítást és ezzel kikényszerítem, hogy a böngésző ne kapja meg a POST/REQUEST értékeket.

Tehát amikor a böngészőnek átadom a html kódot ("Köszönöm, hogy kitöltötted az űrlapot!"), akkor már nem tud az űrlap adatairól. Tehát hiába nyomkodja a user az F5-öt.

Rosszul kérdezek?
6

Értem!

Pepita · 2013. Ápr. 17. (Sze), 23.57
Na, most már értem a kérdést.

Én nem látok hibát, elvi ellentmondást a Location-ben és a redirect-ben sem (mint említettem: használom is). Persze utóbbinál megfelelő státuszkóddal.

Azt pedig nem jelenteném ki, hogy csak a 3. után léphet be a böngésző...
Hát, ez kizárólag tőleg függ, hogy mennyire különíted el a feldolgozást a kimenettől, illetve mennyire ronda kódokat látsz a házad táján... Igazad van, én MVC-ben gondolkodok.
A template-edben nincs semmi PHP? :) (nem kell válaszolnod)
7

nemhogy elegáns, de sokkal elegánsabb..

szabo.b.gabor · 2013. Ápr. 18. (Cs), 02.07
Szerintem a header-rel átirányítás sokkal jobb, mint a fent említett varázslat. egyrészt tuti nem küldi el, másrészt ha frissíti az oldalt a júzer, akkor nem kérdezi meg a böngésző, hogy na most akkor újra elküldjük-e a post adatokat..
9

ez lesz a nyerő

mz82 · 2013. Ápr. 18. (Cs), 10.15
Köszi, akkor meg is erősítettél!
8

Én ezt szerver oldalon oldom

Picure · 2013. Ápr. 18. (Cs), 09.25
Én ezt szerver oldalon oldom meg, ha ugyan azok az adatok mennek a postban, akkor könnyű lecsekkolni, hogy van e már rögzítve..
10

ez is jó

mz82 · 2013. Ápr. 18. (Cs), 10.19
Ez is jó ötletnek tűnik, viszont sokkal nagyobb munka.
11

a böngészők "lelkivilága"

Picure · 2013. Ápr. 18. (Cs), 11.54
a böngészők "lelkivilága" folyamatosan változni fog, ha találsz egy pillanatnyilag jól működő megoldást akkor lehet, hogy egy újabb verzió frissítés után, megint lehet fából vaskarikát "heggeszteni". Igaz, hogy kicsit több munka a szerveroldali megoldás, de a folyamatos problémák miatt az összesen ráfordított időd majd idővel sokkal több lesz... szerintem lehet erre egy jól paraméterezhető általános megoldást csinálni, amit később más űrlapoknál is tudsz használni.. pl.: paraméterben megadsz egy tábla nevet + a vizsgálandó mező neveket, a visszatérési értékben pedig a lekérdezés eredményétől függően adsz vissza paramétert a hibakezelésnek...
12

Nem olvastam végig a válaszokat

RobbeR · 2013. Ápr. 18. (Cs), 14.45
Tippjeim:

- F5 elleni védelemre miért nem használsz PHP oldalon redirect-et? header("Location: formot_tartalmazo_oldal.php"); Szerintem tisztább és egyszerűbb
- $_SESSION[f5_disable]=$str; helyett $_SESSION["f5_disable"]=$str; ! Stringekről van szó a tömbök kulcsainál, macskakörmöket vagy aposztrófokat _kell_ használni
13

Általában igaz, hogy a

inf3rno · 2013. Ápr. 22. (H), 03.13
Általában igaz, hogy a session problémákat chrome esetében a favicon hiánya okozza. Jelen esetben is ez a helyzet.

Egyébként keretrendszereknél ezt session.flash-nek hívják, amikor csak a következő oldal betöltéséig van bent egy érték sessionben, és utána vagy cserélődik, vagy törlődik.