kostenloser Webspace werbefrei: lima-city


PHP Sessions - Sicherheit maximieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    w*o

    Hi!

    Wie wahrscheinlich jeder erfahrene PHP-Programmierer von euch weiß, bietet PHP die session-Funktion an (beispielsweise für Logins oder sowas). Und ich wollt euch einfach mal fragen, was ihr gegen die Sicherheitlücke, die unter Umständen durch die "einfache" Verwendung der Funktion auftritt, stopft.

    Ich mache es, indem ich, nachdem sich der Nutzer angemeldet hat, eine neue Session-ID generiere mit folgender Funktion:
    session_regenerate_id();


    Grüße,
    who

    P.S.: Es soll kein Sammel-Thread werden, schreibt deshalb bitte sinnvolle Beiträge mit Quellennachweisen, da es ein Thema ist, wo man sicher gehen sollte, das es stimmt, was man liest. Vielen Dank ;-)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich benutze diese Funktionen gar nicht, sondern mache es wie viele CMS und Forensysteme. Ich lagere die Session-Daten in eine Datenbank aus und verwalte die Session-IDs selbst.
    Denn da PHP diese Daten in normalen Dateien ablegt, ist diese Variante viel performanter und ich habe vollen Überblick über die Daten und weiß genau, wie ich was löschen / ändern usw. kann.

    LG cookies
  4. Was genau verstehst Du unter "einfache Verwendung" der Funktion?
  5. Autor dieses Themas

    w*o

    rnitsche schrieb:
    Was genau verstehst Du unter "einfache Verwendung" der Funktion?


    Ich meine damit, dass man einfach nur eine Session-ID aufruft, um zu überprüfen, ob der Nutzer angemeldet ist oder nicht, ohne zusätzliche Sicherheitsvorkehrungen wie einen Finger-Abdruck oder dergleichen.

    Hab gerade was gefunden was lesenswertes zu dem Thema gefunden: http://www.mathias-bank.de/2008/02/22/php-sicherheit-session-fixierung/
  6. Also, das Session Hijacking versuche ich ebenfalls so zu lösen wie in dem Artikel angegeben. Weiterhin vergleiche ich die aktuelle IP mit der IP bei Session-Initialisierung. Sind sie unterschiedlich wird sofort alles aus der Session gelöscht und der User abgemeldet. Damit verhindere ich gleich noch, dass ein User angemeldet bleibt, wenn beispielsweise die Session über die URL weitergegeben wird. Im Standardfall ist das hier bei Lima ja deaktiviert (nur über Cookies). Sollte es aber aktiviert sein, wird somit die Weitergabe verhindert.
  7. Ich hab noch nie von Session Hijacking gehört und verstehe es auch nicht.

    Angenommen werden kann, dass Übergabe der Session-ID über ?PHPSESSID nicht möglich ist und angenommen werden kann, dass niemand PHP-Code auf meinen Server einschleusen kann.

    Wie zum Teufel kann jetzt jemand meinen 'session'-Cookie manipulieren? Kann man etwa von example.org aus einen Cookie für example.com setzen? Der Angreifer müsste ja zuerst die Macht erlangen einen Cookie für meine Domain zu setzen. Sprich entweder ausführen von PHP Code (unmöglich) oder XSS (unwahrscheinlich, und wenn doch, dann liegt das Problem hier nicht woanders.)

    Entweder ich bin völlig doof (wahrscheinlich :D) oder das ist kein ernsthaftes Problem.
  8. nikic schrieb:
    Wie zum Teufel kann jetzt jemand meinen 'session'-Cookie manipulieren?


    Das geht so ohne weiteres nicht, aber sobald im URL ?PHPSESSID gesetzt - also vorgegeben - ist, wird diese Session Variable benutzt und dann auch als Cookie gesetzt.

    In dem Beispiel aus dem Artikel ist das folgendermaßen zu verstehen:
    Der Admin bekommt diese e-mail mit dem Hinweis, dass irgendetwas mit seinem Shop nicht stimmt, wenn man auf einer bestimmten Seite ist. Der Admin ist besorgt und klickt auf den Link. Daraufhin wird er vom Angreifer auf eine Seite seines Shops weitergeleitet, allerdings ist hier dann eine vom Angreifer gewählte Session-ID an die URL angehängt. Der Shop verwendet also beim Besuch des Admins diese Session-ID und speichert diese dann in den Cookie beim Admin. Sobald der Admin drin ist, geht der Angreifer mittels derselben Session ID (nur halt an die URL angehängt) auf die Seite und ist ebenfalls eingeloggt.

    Angenommen werden kann, dass Übergabe der Session-ID über ?PHPSESSID nicht möglich ist


    Das stimmt schon, so lange Du mit den Standardeinstellungen hier arbeitest. Das könnte sich aber theoretisch ändern. Ich umgehe diese Standardeinstellung mit einer eigenen Funktion, da viele User sich beschwert haben, dass sie beim Login rausgeflogen sind. Das waren alles User, die keine Cookies akzeptieren. Und wenn die Session ID sichtbar in der URL ist, sollte man einiges berücksichtigen, damit die nicht in falsche Hände gerät. So hängt meine Funktion die ID nicht bei Suchmaschinen an, vergibt neue IDs, wenn ein User mit fremdem Referrer inkl. Session ID kommt oder diese ID am aktuellen Tag noch nie vergeben wurde. Ist ein User angemeldet und kopiert die URL, um einen Freund z.B. auf die Seite aufmerksam zu machen, wird anhand der unterschiedlichen IPs erkannt, dass die Session ID weitergegeben wurde und schon ist man ausgeloggt.

    edit: quote statt code

    Beitrag zuletzt geändert: 6.7.2010 12:08:42 von rnitsche
  9. Da ich meine eigene Datenbankbasierte Session-Klasse nutze, die garantiert nicht auf ?PHPSESSID achtet, bin ich also auf der sicheren Seite?
  10. Ja, wenn du eine eigene Klasse benutzt, die nur auf den Cookie achtet, ist das alles irrelevant. Es sei denn, du benutzt register_globals :wink:
  11. Autor dieses Themas

    w*o

    Ich habe mal eine Klasse geschrieben, die die Session absichert.

    class session {
        var $username;
        var $email;
        var $create_time;
        var $lifetime;
        var $init;
        var $fingerprint;
        var $session_id;
    
        function  __construct($session_id, $lifetime = 7200) {
            $this->set_fingerprint();
            $this->lifetime = $lifetime;
            setcookie('xsession_id', $session_id, (time()) + $lifetime, '/');
            $this->session_id = $session_id;
            $this->init = true;
            $this->save_session();
            return;
        }
    
        private function set_fingerprint() {
            $fingerprintArray = array($_SERVER['HTTP_USER_AGENT'], substr($_SERVER["REMOTE_ADDR"], 0, 5));
            $this->fingerprint = md5(serialize($fingerprintArray));
            setcookie('xsession_fingerprint', $this->fingerprint, (time()) + $this->lifetime, '/');
            return $this->fingerprint;
        }
    
        private function set_user($session_id, $username, $email, $lifetime = 7200) {
            if ($this->init == false) {
                $this->set_fingerprint();
                $this->init = true;
            }
            $this->username = $username;
            $this->email = $email;
            $this->create_time = time();
            $this->lifetime = $lifetime;
            $this->session_id = $session_id;
            $this->save_session();
            return;
        }
    
        private function save_session() {
            $_SESSION['username'] = md5($this->username);
            $_SESSION['email'] = md5($this->email);
            $_SESSION['create_time'] = $this->create_time;
            $_SESSION['lifetime'] = $this->lifetime;
            $_SESSION['fingerprint'] = $this->fingerprint;
            $_SESSION['init'] = $this->init;
            return;
        }
    
        public function check_session() {
            if ($_SESSION['fingerprint'] != $this->fingerprint || !isset($_COOKIE['xsession_id'])) {
                $_SESSION['username'] = NULL;
                $_SESSION['email'] = NULL;
                $_SESSION['create_time'] = NULL;
                $_SESSION['lifetime'] = NULL;
                $_SESSION['fingerprint'] = NULL;
                $_SESSION['init'] = NULL;
                session_destroy();
                return false;
            } else {
                return true;
            }
        }
    }


    Session intialisieren:
    session_start();
    $xsession = new session(session_id());


    Mit einigen Abänderungen könnte man theoretisch ein eigenes, DB-basiertes Session-System draus machen, wenn man den Fingerabdruck, den ich eingebaut habe, verwendet.
  12. g****e

    Session Fixing:
    http://www.cms-sicherheit.de/module-blog-viewpub-tid-1-pid-29.html

    Session Hijacking:
    http://www.cms-sicherheit.de/module-blog-viewpub-tid-1-pid-30.html

    Sessions sind generell eine relativ zu betrachtene sache find ich. ich nutze sie, weil ich bisher noch nicht soweit war eigene sessions zu entwickeln. krieg ich bestimmt auch hin, aber die funktion ist ja schon da. ist halt relativ.

    ich persönlich teste immer ob ne session bereits besteht und weise selbst eine sessionID zu. dann validiere ich die IP, nutze sie als festzuweisung einer person (nicht sicher aber möglich), gleichzeitig lese ich noch explizit den clienten aus und das betriebssystem, verarbeite das auch in bestimmter art und weise und speichere es zu der speziellen ID. ich hoffe noch dass es reicht, reichen tuts nich, das weiß ich, aber ich muss mir noch eine menge gedanken machen.
    ich wills erstmal schwerer machen und dann mal schauen, ich muss noch viel lernen.

    die klassen von euch sind bestimmt hilfreich, und bestimmt auch sicherer, aber ich versuchs erstmal so. die funktion ist ja schon da und einigermaßen gut. oder gibts da gegeneinwände?
    vllt kann man mich ja überzeugen =)
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!