Session's und die Sicherheit

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

  • Session's und die Sicherheit

    Hi erstmal, ich bin neu hier

    Also, nun gleich mal zu meinem Anliegen:

    Ich bin momentan dabei, ein CMS zu coden, und wollte mal die Meinung von ein paar Experten zwecks Sicherheit im Bereich Session's einholen. Speziell im Fall, wenn SID's durch GET übertragen werden.

    Mein Session-System ist momentan eine Klasse, die nicht das Session-System von PHP verwendet, sonders selber die Art der SID-Übermittlung bestimmt, SID's erzeugt und direkt an mySQL angebunden ist. Momentan überprüfe ich folgendes, um festzustellen, ob die SID geklaut wurde oder nicht:

    $REMOTE_ADDR mit der in der DB gespeicherten IP.

    Pauschal gesehn ziemlich sicher, bis auf die Randgruppe der AOL-User, die ja über ein Proxy-Netzwerk surfen (verwendet AOL das eigentlich für "Marktforschungs"-Zwecke ? )

    Wenn der 1. Check eben deshalb fehlschlägt, werden die ersten 3 Stellen der IP-Adresse verglichen (AOL-Proxy-User haben stets 195.93.60.xxx ,das hab ich durch nächtelanges in Logs wühlen bestätigen können) und zusätzlich noch den $HTTP_USER_AGENT

    Wenn die SID durch Cookies übertragen wird, verfahre ich übrigens genauso. Und die bekanntesten Bots kriegen garnicht erst ne SID sondern werden nur über die IP und den $HTTP_USER_AGENT wiedererkannt.

    Mir ist bewusst, dass damit ein AOL-User einem anderen die Kekse klauen könnte, wenn beide den selben $HTTP_USER_AGENT haben und beide nur per GET übertragen können.

    Meine Frage deshalb: Wie kann man das ganze noch verfeinern, damit man den möglich Diebstahl noch schwerer machen kann (unmöglich gibts nicht, ich weiss)

    Ein kleines 2. noch:

    PHP-Code:
        function makeSessID() {
      
    mt_srand(microtime() * 1000000);
      
    $this->SID md5(uniqid(mt_rand()));
        } 
    Ist das zur Erzeugung der SID zufällig genug ?


    (Und noch ein paar anmerkungen für die PHP-Experten, die mich erstmal fragen werden, wie es mit der restlichen Sicherheit aussieht: [Ich kenn euch ]

    Ich validiere JEDEN Input, [ _GET _POST _COOKIE und _SERVER ] den ich auch wirklich benötige auf SQL-Injections, durchaus auch rekursiv bei übergebenen Array's und auf den zu erwartenden Datentyp.

    PHP-Code:
    include($_GET['site']); 
    ist selbstmord, deshalb benutz ich das auch nicht.
    Und: Meine Scripte laufen bei register_globals OFF, auch wenn sich das oben nicht ganz so herausliest. Wenn ein Provider das auf ON hat, setz ich, wenn möglich schnell einen .htaccess in den Document Root, um den Misstand zu beheben.
    Soviel dazu )
    Zuletzt geändert von EEBKiller; 06.05.2005, 01:27.

  • #2
    OffTopic:
    immerhin - zu viel paranoia ist besser, als zu wenig.


    1. ne frage vorweg - warum nicht den php-eigenen session-mechanismus benutzen? kannst es ja immer noch mit zusätzlichen features "verfeinern", falls es dir nicht reichen sollte.

    2. uniqid(mt_rand()) reicht vollkommen.

    Kommentar


    • #3
      Original geschrieben von penizillin
      1. ne frage vorweg - warum nicht den php-eigenen session-mechanismus benutzen? kannst es ja immer noch mit zusätzlichen features "verfeinern", falls es dir nicht reichen sollte.
      Willst dus ehrlich wissen ?
      Weil ich zu Faul bin, etwas per ini_set() zu ändern (PHPSESSID in meinen eigenen Namen), vorallem, da die Funktion ja manche Provider ganz verbieten und die Erkennung, ob Cookies funktionieren oder doch nur per GET, PHP bei mir irgendwie nicht ganz rafft. Deshalb hab ich gleich ne Klasse dafür gebaut.

      Wenn schon, dann richtig

      Kommentar


      • #4
        sei nicht albern und schieb's nicht auf die provider/php/wetter/götter.
        sessions funktionieren wunderbar und warten darauf, von dir erfasst und begriffen zu werden.

        Kommentar


        • #5
          Jetzt, wo ich nen eigenen Handler dafür habe, werde ich garantiert nicht wieder den von PHP verwenden

          Ausserdem war das immer noch keine direkte Antwort auf die Sicherheitstechnische Frage

          Kommentar


          • #6
            von sicherheit kann nicht die rede sein, wenn aus nicht vertretbaren gründen zugunsten von neuen, unerprobten und fehleranfälligen eigenkreationen auf gute, bewährte lösungen verzichtet wird.

            ich darf kurz übertreiben, um es deutlicher zu machen:
            PHP-Code:
            function my_echo($s){
                print 
            $s;

            thedailywtf.com hat mehr beispiele.

            Kommentar


            • #7
              Was mich aber immer noch kein Stück weitergebracht hat ...

              Denn egal, ob ich meinen Handler nehme, oder den, der bei PHP dabei ist:

              Wie kann ich feststellen, dass die SID nicht geklaut wurde. Schließlich muss ich das bei einem

              session_start()
              $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

              [...]

              - Zeugs auch tun und nicht einfach annehmen, dass das schon der selbe User sein wird, der gerade wieder die SID übertragen hat.

              Kommentar


              • #8
                PHP-Code:
                session_start();
                        if(!isset(
                $_SESSION['IP'])) {
                            
                $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
                        }
                        if(
                $_SESSION['IP'] != $_SERVER['REMOTE_ADDR']) {
                die();

                so könnte man es mit der normalen session von php machen....

                Kommentar


                • #9
                  beispiel - mitarbeiter eines call-centers haben die gleichen rechner mit absolut identischen user agents. sie kommen alle über ein proxy ins netz und haben nach außen hin die gleiche ip. willst du die mitarbeiter ihre fingerabdrücke scannen lassen?

                  Kommentar


                  • #10
                    kann man die mac adresse eines pc's mit php abfragen?

                    EDIT:
                    Wobei, das würde ja durch den proxy auch wieder gekillt werden...

                    Kommentar


                    • #11
                      Genau DARUM gehts mir.

                      Was ist sonst noch absolut einzigartig an jedem Rechner im Netz ?

                      Die Mac-Addy ?
                      - Wohl kaum, wird nämlich garnicht erst übertragen ....

                      Vielleicht eine "Aktions-ID", die bei einem Klick verfällt und ebenfalls per GET übertragen wird und deshalb ebenfalls per Copy-Paste im nächsten IRC-Channel oder Messenger Fenster landet ?

                      Oder leben wir in einer freien Welt, in der kein Check nötig ist, und jeder User oder Mitarbeiter auf meiner Seite ebenfalls volle Adminstrationsrechte haben darf ?

                      Vielleicht ganz auf Sessions verzeichten. Wie mach ich den Leuten klar, dass sie für jeden Klick ihre Benutzerdaten bereit halten sollen ?

                      ---------------

                      Wieviele und welche Informationen eines Clients habe ich, um ihn mit sehr sehr hoher wahrscheinlichkeit erneut SICHER identifizieren zu können ???
                      Zuletzt geändert von EEBKiller; 06.05.2005, 02:25.

                      Kommentar


                      • #12
                        Was ist sonst noch absolut einzigartig an jedem Rechner im Netz ?
                        nichts, fürchte ich.
                        Adminstrationsrechte
                        übertreib mal nicht..
                        Vielleicht ganz auf Sessions verzeichten.
                        und dann?
                        Wieviele und welche Informationen eines Clients habe ich
                        schau mal ins phpinfo() rein.

                        Kommentar


                        • #13
                          So viele Hit's und trotzdem keine Antwort ...

                          Kommentar


                          • #14
                            Hallo,

                            ist keinesfalls eine 100%ig sichere Lösung, aber eine Möglichkeit wäre eine Art 'temporären' Link zu erzeugen, der nur einmal verwendet werden darf.

                            So in der Art:
                            <A HREF="link.php?PHPSESSID=wasweisich&Link_ID=342343234234">Link</A>

                            Der Parameter Link_ID wird bei jedem Aufruf zufällig generiert und zusammen mit der PHPSESSID in einer DB gespeichert, die Link_ID ist dann nur für einen Aufruf gültig. Wird der gleiche Parameter ein zweites Mal verwendet wird die Session gelöscht.

                            Das ganze ist aber letztlich auch nur eine Hürde die natürlich überwindbar ist, aber dem einen oder anderen macht man's damit ein wenig schwerer.

                            Gruss
                            Quetschi
                            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                            Schön - etwas Geschichte kann ja nicht schaden.
                            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                            Kommentar


                            • #15
                              Zwei Dinge sind zu unterscheiden.
                              1. Vorhersagbarkeit der generierten Session-ID
                              2. Potential der in der Session gespeicherten Daten, die Sicherheit zu steigern

                              1. Wenn du session_start() einsetzt, generiert PHP für dich eine Session-ID.
                                Diese Session-ID ist der MD5-Hash von $_SERVER['REMOTE_ADDR'], aktuelle Sekunden, aktuelle Millisekunden und einer zufällig erzeugten Zahl, erzeugt basierend auf der Uhrzeit inkl. Millisekunden (u. a.).

                                Du benutzt für die Session-ID den MD5-Hash von uniqid und mt_rand.
                                Da MD5 = MD5, stellt sich hier also die Frage, was zufälliger ist: uniqid und mt_rand oder die PHP-Standardvariante
                              Ich denke mal, PHP macht das besser als du.

                              Wenn die Session-ID eines anderen nicht erraten werden kann, kann sie aber dennoch evtl. "gesnifft" werden, aber das sei hier nur der Vollständigkeit halber erwähnt, da das in beiden Varianten - deiner und der von PHP - gleichermaßen möglich ist.


                              Kommen wir jetzt zum zweiten Punkt:
                              Wenn du verhindern willst, dass ich mit deiner Session-ID Aktionen unter deinem Namen ausführe, dann musst du in der Session Daten speichern, die eindeutig dich identifizieren.

                              Du hast das mit der IP-Adresse versucht, aber das ist ein nicht wirklich guter Ansatz, denn:
                              1. Steht in $_SERVER['REMOTE_ADDR'] teilweise bei vielen Leuten die gleiche IP, nämlich bei allen, die über einen Proxy auf deine Seiten kommen
                              2. Ändert sich die IP bei den meisten Leuten alle 24 Stunden "daueronline", bei Modem-/ISDN-Benutzern mit Sicherheit häufiger, da die sich häufiger einwählen

                                Gibt mit Sicherheit den ein oder anderen, der seinen PC so eingestellt hat, dass nach x Minuten Inaktivität die Verbindung automatisch getrennt wird. Wenn diese Leute also nach bspw. 5 Minuten auf einen Link auf deiner Seite klicken, wird eine neue Verbindung aufgebaut (mit neuer IP) und du identifizierst die Session als "geklaut".


                              Der User-Agent ist noch weniger geeignet, denn das identifiziert einen Benutzer nicht wirklich, vor allem in Anbetracht der Tatsache, dass ich da einen x-beliebigen Wert eintragen kann.

                              Was wäre geeigneter?
                              • Die MAC-Adresse, die aber auch gefälscht werden kann und darüber hinaus nicht vom Webserver aus ermittelbar ist
                              • Anzapfen eines TRACE-Services, der dir die Koordinaten zur IP liefert
                                (Nein, dass ist nicht mein Ernst, aus wohl denkbaren Gründen)
                              • Persönliche Daten des Benutzers (als Person, nicht als PC)
                                Das ist technisch machbar, aber...

                                Da du diese Daten nicht automatisch ermitteln kannst, müsstest du sie bei jedem Aufruf einer deiner Seiten vom Benutzer erneut eingeben lassen und mit den in der Session gespeicherten Daten abgleichen, also auch keine praktikable Idee.


                              Die einzigen Möglichkeiten, die mir momentan einfallen, sind der "TAN-Ansatz" von Quetschi oder, wenn du mit PHP-Sessions arbeiten wolltest, der Einsatz von session_regenerate_id.

                              Was ich mich aber frage (abgesehen von: "Warum nutzt du nicht PHP-Standard, wenn der so unsicher wäre, meinst du nciht, das wäre mittlerweile rausgekommen und verbessert worden?"), ist: Warum zum Geier der ganze Aufwand?
                              Kann es sein, dass du an deinem Ansatz festhalten willst, weil es dich Zeit gekostet hat, ihn zu realisieren?

                              OffTopic:
                              P.S.:
                              Eine Session
                              Viele Sessions
                              Ohne '
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X