Ankündigung

Einklappen
Keine Ankündigung bisher.

Browser unerklärliches Phänomen

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Browser unerklärliches Phänomen

    Ich habe eine Anwendung als Test erstellt. Ich möchte die Session in der Datenbank vorhalten. Die Anwendung läuft Ajax basiert mit Unterstützung von PHP und mysql. Beim Aufruf der Website wird geprüft ob bereits eine Session besteht, wenn nicht, wird eine erstellt, ein token dazu und ein Link zusammengebaut, der diese Daten enthält (http://www.........?PHPSESSID=hgsgjk...gjkaslghaskljg). Dieser Link wird jetzt über Header() wieder aufgerufen. Soweit so gut. Jetzt findet die Prüfung eine Session und somit wird der else Teil wirksam, hier wird noch auf die Dauer geprüft und die Session gegebenenfalls abgebrochen und wieder neu gestartet. Auch wieder mit neuem token. Wieder wird ein Link erstellt und wieder über Header() neu aufgerufen. Nun läuft alles durch (Session da -> else -> Zeit ok -> weiter im Script). Soweit funktioniert das auch.

    Nach dem Durchlauf beginnt dann die eigentliche Anwendung. Als erste werden Pfade in die DB geschrieben, die zu bestimmten Ordnern führen aber die SessionID im Namen haben. Diese Ordner werden dann auch gleichzeitig mit erstellt. So hat jede Session einen eigenen Temp Ordner. Nach dieser Aktion findet kein weiterer Aufruf einer HTML oder PHP Seite mehr statt, weder als Link, Form oder header(). Alles passiert jetzt nur noch per Ajax und nachladen von Inhalten.

    Bitte keine Diskussion über die Sinnhaftigkeit dieser Vorgehensweise, das ist ein Test für mich.

    Es treten dabei ein paar Probleme auf. Laut jeder Doku sollte ein Aufruf über header() keine neue Session generieren. Aber es passiert trotzdem. Manchmal. Ich habe nun festgestellt, das ein fehlerhafter Pfad der CSS Datei für ein Hintergrundbild dazu führt, dass die Anwendung neu startet und sogar eine neue Session erstellt. In den Dokus kann ich zu diesem Fall nicht finden. Ist das etwas bekanntes?

    Und noch etwas. Im Edge läuft mein Aufruf als Endlosschleife. Bei jedem Aufruf über header() macht der Browser eine neuen Session. Das Script wird also gar nicht bis zum Ende ausgeführt, ein die() nach der Sessionprüfung hat keine Wirkung. Trotzdem werden die Ordner erstellt und die Pfade in die DB geschrieben, obwohl das alles im Script erst nach dem die() kommt. Für mich eine vollkommen unerklärliche Vorgehensweise. Ist das erklärbar?





  • #2
    Was bedeutet "ein Aufruf über header()" ?

    und zeig bitte etwas von deinem Code her, was davon dem Sinn beeinflüßtwert ist.
    Signaturrrrrrr

    Kommentar


    • #3
      PHP-Code:
      if(!count($_SESSION) || !isset($_REQUEST['token']) || $_REQUEST['token'] == "0" || !isset($_REQUEST['PHPSESSID']) || session_id() != $_REQUEST['PHPSESSID']){
        
      //prüft auf Session, Token und andere Übergaben, wenn kein Treffer dann wird eine neuer Link erstellt und abgesendet
        
      $checkSessionTest 1;
        
      $lifetimeOut 0;
        
      $_SESSION["exist"] = true;
        
      $_SESSION["time"] = time();
        
      $IP $_SERVER['REMOTE_ADDR'];
        
      $IP_token $IP.$_SERVER['HTTP_USER_AGENT'].time();
        
      $setSessionIdScript session_id();
        
      $token getToken($IP_token$setSessionIdScript);
        
      $strCount strpos($_SERVER['QUERY_STRING'], session_name());
        if(
      $strCount && $strCount 0){
          
      $_SERVER['QUERY_STRING'] = substr($_SERVER['QUERY_STRING'], 0, ($strCount-1));       //das & muss auch mit weg
          
      }
        
      $back getUserLink();
        
      header("Location: " $back[1]. "&" session_name() . "="session_id() ."&token=" $token"&checkLink=" .time());
        
      //selbstaufruf um session und token zu generieren
        
      }else{
             
      //alle vorherigen Prüfungen OK, aber zeit abgelaufen
             
      $IP $_SERVER['REMOTE_ADDR'];
             
      $setSessionIdScript session_id();
             
      $setSessionNameToScript session_name();
             
      $setSessionToScript $setSessionNameToScript."=".$setSessionIdScript;

             require_once(
      "init/lifetime.php");
             
      $checkSessionTest 2;

             if(
      time() > ($_SESSION["time"] + $lifetime)){
                
      $back getUserLink();
                
      //Neusart mit Token 0, kommt somit wieder in obige Abfrage, teil vor else, bekommt neue session und token und wird wieder neu gestartet, jetzt werden beide Prüfungen ohne Beanstandungen durchlaufen
                //weiterer Code wird ausgeführt
                
      header("Location: " $back[1]. "&" session_name() . "="session_id() ."&token=0&checkLink=" .time());
                }
             }


      //weiterer Code
      $interfaceTool -> checkTodayImageFolder(_REL_DIR_TEMP_IMAGES, (time() - $delTime), $cm_key$setSessionIdScript$token);     //prüft und erstellt die Ordnerpfade und schreibt die in die DB

      //weiterer Code
      .

      Kommentar


      • #4
        jetzt vergleich mal was du mit redirect sendest und was danach kommt.
        PHP-Code:
        echo '<h4>SESSION_COUNT = 'count($_SESSION), ', REQUEST</h4><pre>'prunt_r$_REQUESTtrue ), '</pre>';
        if(!
        count($_SESSION) || !isset($_REQUEST['token']) || $_REQUEST['token'] == "0" || !isset($_REQUEST['PHPSESSID']) || session_id() != $_REQUEST['PHPSESSID']){ 
        und wo ist dein die( ), nach dem header( "Location" ) ?

        und was gibt dein $back = getUserLink(); aus ?
        Signaturrrrrrr

        Kommentar


        • #5
          das die war nur zum test vor dem
          checkTodayImageFolder
          getUserLink gibt mir den Link zurück, den ich brauche um den redirekt neu aufzurufen
          der Link sieht dann z.B. so aus



          Code:
          https://kXXXXXXXXXXXXXXX/index.php?cm_key=a87ff679a2f3e71d9181a67b7542122c&PHPSESSID=eq5p91vr7a70f0tch3cq7ru6j0&token=2553b65a00a191bdb2a3bba544ac1b0a&checkLink=1538295843
          cm_key ist erst für später im Script relevant, checkLink ist nur eine Testvariable (time(), derzeit ohne Funktion)

          das Script startet entweder mit
          einer leeren Session (beim ersten Aufruf)
          einem fehlenden Token (beim ersten Aufruf oder einem modifizierten Copie und Paste aus einem anderen Browser)
          einem Token mit wert 0 (nach dem verarbeiten im else Block und einer abgelaufenen Session oder einem modifizierten Copie und Paste aus einem anderen Browser)
          mit einer fehlenden PHPSESSID (beim ersten Aufruf oder einem modifizierten Copie und Paste aus einem anderen Browser)
          mit einer neuen session, deren ID von der PHPSESSID im Request abweicht (bei Copie und Paste aus einem anderen Browser, oder einem Tab mit einer alten session)

          bei alle dem kommt der neue Request auf Grund des erstellten Links aus dem redirekt wieder in die if Abfrage. Da jetzt eine SESSIONID und ein Token da sind, das Token nicht 0 ist und auch count($_SESSION) mehr als 0 ist, geht es zum else Teil. Wenn die Zeit auch passt, geht's im Script weiter. Auf jeden Fall kommt meine Funktion, bzw. deren Aufruf, erst nach dem if else Konstrukt. Auch wenn meine if Abfrage einen Fehler verursachen würde, der immer wieder in den if Teil verzweigt, dann dürfte nie diese Funktion zum Aufruf kommen. Aber genau das passiert. Dummerweise ist das nicht gezielt reproduzierbar. Das klappt 100mal du dann auf einmal nicht mehr. Alle Browser außer Edge, laufen dann 10 - 20 mal durch und machen dann wieder, was ich eigentlich möchte. Der Edge hängt sich komplett auf.
          Ich erwarte ja keine Lösung, das wäre zu vermessen. Aber ich weiß nicht mehr wo ich noch suchen soll.

          Kommentar


          • #6
            Session-IDs in der URL sind eine ganz schlechte Idee. Du solltest diese immer im HTTP-Header senden.

            Wobei das der Browser sogar vollkommen automatisch kann. Also eigentlich musst du hier gar nichts machen, außer cookiebasierte Sessions zu aktivieren (was die Standardeinstellung von PHP ist).

            Man muss nicht für alles das Rad neu erfinden, wenn es schon eines gibt, das sehr gut fährt.

            Kommentar


            • #7
              Zitat von psygonis Beitrag anzeigen
              Das klappt 100mal du dann auf einmal nicht mehr. Alle Browser außer Edge, laufen dann 10 - 20 mal durch und machen dann wieder, was ich eigentlich möchte. Der Edge hängt sich komplett auf.
              Ich erwarte ja keine Lösung, das wäre zu vermessen. Aber ich weiß nicht mehr wo ich noch suchen soll. [/SIZE][/FONT][/COLOR][/LEFT]
              beim session_start( ) wird entsprächende session-datei exclusiv gesperrt.

              du gabst noch keine Antwort auf - wo ist dein die( ), nach dem header( "Location" ).
              Signaturrrrrrr

              Kommentar


              • #8
                Zitat von hellbringer Beitrag anzeigen
                Session-IDs in der URL sind eine ganz schlechte Idee. Du solltest diese immer im HTTP-Header senden.

                Wobei das der Browser sogar vollkommen automatisch kann. Also eigentlich musst du hier gar nichts machen, außer cookiebasierte Sessions zu aktivieren (was die Standardeinstellung von PHP ist).

                Man muss nicht für alles das Rad neu erfinden, wenn es schon eines gibt, das sehr gut fährt.
                Das ist eine Ajax Anwendung, die als Plugin in einem Shop laufen kann. Dazu wird die in einem I-Frame aufgerufen. Der Safari blockiert da die Cookies, deshalb dieser Weg.

                Kommentar


                • #9
                  Zitat von K313 Beitrag anzeigen

                  beim session_start( ) wird entsprächende session-datei exclusiv gesperrt.
                  wie ist das zu verstehen?

                  Zitat von K313 Beitrag anzeigen
                  du gabst noch keine Antwort auf - wo ist dein die( ), nach dem header( "Location" ).
                  die kommt vor dem
                  checkTodayImageFolder,
                  war aber nur temporär als Test

                  Kommentar


                  • #10
                    Zitat von psygonis Beitrag anzeigen
                    Das ist eine Ajax Anwendung, die als Plugin in einem Shop laufen kann. Dazu wird die in einem I-Frame aufgerufen. Der Safari blockiert da die Cookies, deshalb dieser Weg.
                    Also der Browser blockiert aus Sicherheitsgründen die Cookies und du suchst einen Weg eine Sicherheitslücke einzubauen?

                    Davon abgesehen was daran soll Plugin sein, wenn es auf der Session-ID und der Datenbank des Hostsystems basiert? Da kannst du dir ja gleich die Iframes sparen.

                    Iframes machen dann Sinn, wenn externe Inhalte eingebunden werden und nicht von der selben Datenbank mit der selben Session-ID.

                    Kommentar


                    • #11
                      ok, hab erste Zeile in #5 falsch verstanden.

                      Also, wenn du willst, dass die function "$interfaceTool -> checkTodayImageFolder( )" nach dem redirect nicht aufgerufen wird, würde ich dir empfehlen, die documentation für function header( ) aufmerksam durchlesen, was sie tut und was gescheht nach ihrer aufruf.
                      Signaturrrrrrr

                      Kommentar


                      • #12
                        Zitat von hellbringer Beitrag anzeigen

                        Also der Browser blockiert aus Sicherheitsgründen die Cookies und du suchst einen Weg eine Sicherheitslücke einzubauen?

                        Davon abgesehen was daran soll Plugin sein, wenn es auf der Session-ID und der Datenbank des Hostsystems basiert? Da kannst du dir ja gleich die Iframes sparen.

                        Iframes machen dann Sinn, wenn externe Inhalte eingebunden werden und nicht von der selben Datenbank mit der selben Session-ID.
                        Die Anwendung läuft stand Alone auf allen Browsern oder in einem Shop. Dann wird die in einem IFrame aufgerufen.

                        Kommentar


                        • #13
                          Zitat von K313 Beitrag anzeigen
                          ok, hab erste Zeile in #5 falsch verstanden.

                          Also, wenn du willst, dass die function "$interfaceTool -> checkTodayImageFolder( )" nach dem redirect nicht aufgerufen wird, würde ich dir empfehlen, die documentation für function header( ) aufmerksam durchlesen, was sie tut und was gescheht nach ihrer aufruf.
                          Was genau willst Du mir damit sagen? Natürlich soll die Funktion dann aufgerufen werden. Aber erst nach dem Durchlauf der Abfrage. Wenn die aber jedes mal eine neue Session generiert und ann dadurch jedes Mal wieder neu startet, kann die doch nie bis dahin kommen.
                          Header sendet doch an der Stelle einen neuen Aufruf an den angegebenen Link. Alles danach wird nicht mehr verarbeitet. Oder sehe ich das falsch?

                          Kommentar


                          • #14
                            Zitat von psygonis Beitrag anzeigen
                            Alles danach wird nicht mehr verarbeitet. Oder sehe ich das falsch?
                            Ja, siehe auch https://stackoverflow.com/questions/...ocation-header

                            Kommentar


                            • #15
                              Zitat von psygonis Beitrag anzeigen
                              Die Anwendung läuft stand Alone auf allen Browsern oder in einem Shop. Dann wird die in einem IFrame aufgerufen.
                              Dann sendet doch eh der Browser automatisch die Session-ID mit. Kein Grund für so Kunststückchen.

                              Kommentar

                              Lädt...
                              X