David: Session per URL

Hallo zusammen,

ich versuche gerade, den Login mittels sessions in PHP (Link) nachzubauen.

Alles klappt wunderbar, solange Cookies im Browser (Firefox 3) aktiviert sind. Wenn ich sie deaktiviere, funktioniert der Login nicht mehr, da die $_SESSION offensichtlich nicht übergeben wird. Nach dem Login wird man nicht eingeloggt ausgewiesen.

Laut den Informationen vom PHP Manual (Link) verstehe ich das so, dass ich nicht noch etwas ändern muss, wenn die Cookies beim client nicht funktionieren. Meine PHP Version ist 5.2.6.

Die Optionen session.use_trans_id = 1 und session.use_only_cookies = off sollten das meiner Meinung nach erlauben - siehe Auszug von phpinfo():

session.auto_start Off Off
session.bug_compat_42 Off Off
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly On On
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 100 1000
session.gc_maxlifetime 10 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 1 1
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /tmp /var/lib/php5
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off On
session.use_trans_sid 1 0

Hier noch der relevante Code zum Login und Identifizieren:

login.php:

<?php  
     if ($_SERVER['REQUEST_METHOD'] == 'POST') {  
      session_start();  
  
      $username = $_POST['username'];  
      $passwort = $_POST['passwort'];  
  
      $hostname = $_SERVER['HTTP_HOST'];  
      $path = dirname($_SERVER['PHP_SELF']);  
  
      // Benutzername und Passwort werden überprüft  
      if ($username == 'benjamin' && $passwort == 'geheim') {  
       $_SESSION['angemeldet'] = true;  
  
       // Weiterleitung zur geschützten Startseite  
       if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {  
        if (php_sapi_name() == 'cgi') {  
         header('Status: 303 See Other');  
         }  
        else {  
         header('HTTP/1.1 303 See Other');  
         }  
        }  
  
       header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.php');  
       exit;  
       }  
      }  
  
[...]  

auth.php:

<?php  
     session_start();  
  
     $hostname = $_SERVER['HTTP_HOST'];  
     $path = dirname($_SERVER['PHP_SELF']);  
  
     if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {  
      header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/login.php');  
      exit;  
      }  
?>  

Hat jemand von euch eine Idee, warum die session id ohne Cookies nicht weitergegeben wird? Geht das, ohne die SID überall einbauen zu müssen? Ich bin für jede Hilfe dankbar.

Beste Grüße
David

  1. Hallo,

    session.use_cookies On On
    session.use_only_cookies Off On
    session.use_trans_sid 1 0

    Warum steht hier On On, Off On, 1 0 usw? In meiner php.ini gibt es keine derartigen Einträge. Allerdings kann dies eine Syntax sein, die mir nicht geläufig ist. Sollte es darüberhinaus nicht
    session.use_cookies = 1
    session.use_only_cookies = 0
    session.use_trans_sid = 1
    heißen?

    Desweiteren will ich dir zwar nicht in deine Entscheidung dreinreden, SessionIDs per URLs zu übergeben, ich würde das aber nicht tun. Wenn so eine URL per Suchmaschine indiziert wird, könnte jemand diese Session "hijacken".
    Und jemand, der seine Cookies deaktiviert, hat eben Pech gehabt. Die Sicherheit deiner Besucher sollte dir in diesem Fall einfach wichtiger sein, als irgendwelche Besucher, die meinen Cookies deaktivieren zu müssen.

    Markus

    --
    1. Hallo Markus,

      session.use_cookies On On
      session.use_only_cookies Off On
      session.use_trans_sid 1 0

      Warum steht hier On On, Off On, 1 0 usw? In meiner php.ini gibt es keine derartigen Einträge. Allerdings kann dies eine Syntax sein, die mir nicht geläufig ist. Sollte es darüberhinaus nicht
      session.use_cookies = 1
      session.use_only_cookies = 0
      session.use_trans_sid = 1
      heißen?

      Das sind Auszüge der Ausgabe von phpinfo(), nicht der php.ini selbst. Jede Option hat einen lokalen und einen Haupt(Master)-Wert, deshalb zwei.

      Desweiteren will ich dir zwar nicht in deine Entscheidung dreinreden, SessionIDs per URLs zu übergeben, ich würde das aber nicht tun. Wenn so eine URL per Suchmaschine indiziert wird, könnte jemand diese Session "hijacken".

      Das Login-Skript sollte nur der Startpunkt sein. Ich wollte auch zusätzliche Mechanismen einbauen, delche die Sicherheit weiter ausbauen. Ich stimme dir völlig zu, dass die Weitergabe sehr unsicherer als per Cookie ist.

      Und jemand, der seine Cookies deaktiviert, hat eben Pech gehabt. Die Sicherheit deiner Besucher sollte dir in diesem Fall einfach wichtiger sein, als irgendwelche Besucher, die meinen Cookies deaktivieren zu müssen.

      Ja, aber leider sind das so viele Nutzer...
      Für das Login-Skript werde ich es vielleicht wirklich nur bei Cookies lassen; auf jeden Fall würde es mich aber interessieren, was hier nicht läuft.

      Beste Grüße
      David

  2. echo $begrüßung;

    Hat jemand von euch eine Idee, warum die session id ohne Cookies nicht weitergegeben wird? Geht das, ohne die SID überall einbauen zu müssen? Ich bin für jede Hilfe dankbar.

    Es gibt noch die Direktive url_rewriter.tags aus dem Abschnitt standard. Die enthält die Elemente, die um die SID ergänzt werden sollen.

    Wenn bei dir Nicht-Cookie-Sessions global wegkonfiguriert sind (was aus dem rechten Wert hervorgeht)

    session.use_cookies On On
      session.use_only_cookies Off On
      session.use_trans_sid 1 0

    dann wird url_rewriter.tags vermutlich auch manipuliert worden sein.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      Es gibt noch die Direktive url_rewriter.tags aus dem Abschnitt standard. Die enthält die Elemente, die um die SID ergänzt werden sollen.

      Wenn bei dir Nicht-Cookie-Sessions global wegkonfiguriert sind (was aus dem rechten Wert hervorgeht)

      session.use_cookies On On
        session.use_only_cookies Off On
        session.use_trans_sid 1 0

      dann wird url_rewriter.tags vermutlich auch manipuliert worden sein.

      danke für die Info.

      Ich habe url_rewriter.tags auf a=href,area=href,frame=src,input=src,form=action
      und sicherheitshalber arg_separator.output auf &amp; gesetzt.

      Allerdings ändert das leider nichts, ohne Cookies ist immer noch keiner Weiterkommen. Sind die url_rewrite.tags richtig für die header-Anweisung? Übersehe ich etwas?

      1. Hi,

        Sind die url_rewrite.tags richtig für die header-Anweisung?

        Nein.
        url_rewiter_tags gibt die Stellen im HTML an, an denen vor der Ausgabe des Outputs an den Browser die SID eingesetzt wird.

        Wenn du per Location-Header irgendwohin umleiten, und dabei die SID als Fallback fuer den Fall, dass der Client keine Cookies akzeptiert, als GET-Parameter mitgeben willst, dann musst du das selber machen.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hallo ChrisB,

          Wenn du per Location-Header irgendwohin umleiten, und dabei die SID als Fallback fuer den Fall, dass der Client keine Cookies akzeptiert, als GET-Parameter mitgeben willst, dann musst du das selber machen.

          danke für die Info.
          Dann hatte ich grundsätzlich etwas falsch verstanden, jetzt ist es klar.