Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Sessionhandling: Wie vermeide ich Außensessionübernahmen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Sessionhandling: Wie vermeide ich Außensessionübernahmen

    Hallo,

    ich habe folgendes Problem. Für benutzer ohne Cookies wird die SID entsprechend angehangen. Nun kann ein Besucher eine solche URL kopieren und als Link auf seine eigene Seite setzen. So far so gut.

    Meine Erfahrung: Kommt ein Benutzer über einen solchen Link auf die Website und hat die Cookies aus, wird genau die in der URL.SID übertragene SessionID als die des Besuchers ggf. neu angelegt.

    Problem: Übles Sicherheitsloch. Zwei Besucher, die über diese URl kommen, teilen sich eine Session.

    Meine derzeitige Lösung sieht so aus, dass ich, falls eine Session zu beginnen ist, die URL analysiere und im Falle, dass eine SID darin enthalten ist, die gewünschte Seite noch einmal per Redirect aufrufe. Klappt prima!

    Code:
    ...
    elseif (strpos($_SERVER['QUERY_STRING'], session_name()) !== FALSE) # to prevent session reuse
    {
    	$scriptName = $_SERVER['SCRIPT_URI'];
    	$parms	      = stripSID($_SERVER['QUERY_STRING']);
    	$redirect      = $scriptName . whether($parms, '?' . $parms, '');
    	header("Location: $redirect");
    	exit;
    } ...
    Weiß jemand, ob (und wie) das Problem auch lösbar ist ohne einen erneuten Aufruf der Seite?

    Könnt Ihr auch bestätigen, dass dieses Problem nur bei ausgeschalteten Cookies auftritt, da der Browser andernfalls sich um die übertragene SID nicht schert sondern ihn nur die Cookies-SessionID interessiert? (das zeigten zumindest meine Tests)

    Thanx again

  • #2
    Auch hier:
    Thread verschoben:
    Profi Fortgeschrittene
    (lässt ja halbwegs durchblicken dass du schon länger als 2 Wochen PHP machst)

    Kommentar


    • #3
      Folgendes:

      - Speicher doch den User-Agent in der Session, dann kannst du zumindest schonmal sagen, wem die Session gehört, bzw. wem sie ziemlich wahrscheinlich nicht gehört. Wenn die User-Agents verschieden sind, kannst du für diesen Besucher dann nämlich eine neue Session erzeugen.
      - was ist denn eigentlich strpos($_SERVER['QUERY_STRING'], session_name()) !== FALSE? Macht man das nicht mit isset($_GET[session_name()])?
      - was ist whether()?
      - was ist so schlimm an einem internen Redirect?
      - warum sollte ein Besucher einen Link mit einer SID kopieren? Wenn doch musst du das dem User eben begreiflich machen, dass damit Fremde Zugang zu seinem Account bekommen
      - der Sinn der Weiche ist mir eigentlich nicht ganz klar..

      Kommentar


      • #4
        Zitat von Zergling
        - warum sollte ein Besucher einen Link mit einer SID kopieren? Wenn doch musst du das dem User eben begreiflich machen, dass damit Fremde Zugang zu seinem Account bekommen
        user sind oft DAUs so kann man da find ich nicht reagieren, und wer achtet da schon wenn er seinem kumpel(s) via forum, icq oder sonstwas nen link schicken will ob da ne SID drin ist ? den meisten usern ist die url sobald da ein ? drinvorkommt ein absolutes rätsel ... :P

        Kommentar


        • #5
          warum sollte ein Besucher einen Link mit einer SID kopieren?
          robo47 hat da absolut Recht.

          Ein Kunde hat in einem Subportal mit einer SID auf den Hauptshop verlinkt. Irgendwann bekam er dann eine böse E-Mail, wie erschreckend schlampig man mit den Daten umgehen würde, da er plötzlich die Daten eines anderen Benutzers sah. (Aus weiser voraussicht x-en wir Kreditkartendaten grundsätzlich teilweise aus.) Aber nun könnt Ihr sicher verstehen, dass es sicherer ist, so etwas auf jeen Fall abzufangen.

          Zudem hat Google auch einige solche Links aufgenommen (kann heute nicht mehr passieren, da wir die meisten Agenten nun erkennen und reagieren).

          So viel zu dieser Frage.

          --------

          Macht man das nicht mit isset($_GET[session_name()])
          Yes, Sir! Ich verneige mein Haupt.

          ---------

          was ist whether()?
          signatur: string whether(b bool, s1 string, s2 string)
          gibt s1 zurück, falls b, sonst s2. Ein iff() gibt es in PHP ja nicht.

          Ich befürchte, gleich kommt von Dir: "Macht man das nicht mit ...."
          Allein, ich kann nicht alle Funktionen von PHP kennen. Erst vor ein paar Tagen sah ich irgendwo nl2br(). Tja, habe ich auch schon irgendwo selbst geschrieben. Das ist so wie vor 15 Jahren mal mit Clipper.

          -------

          Und nun zur Deiner Hauptfrage und meinem Hauptproblem

          was ist so schlimm an einem internen Redirect?
          Eigentlich nur, dass der externe HTTP_REFERER verloren geht, es sei denn, man hängt in per GET an die Umleitung oder speichert ihn in der Session. Ersteres (URI ändern) wollte ich wegen Suchmaschinen nicht (am Ende würde Google ja noch Links mit Referer aufnehmen). Zweiteres ging zunächst nicht, weil durch die Umleitung ja eine neue Session gestartet wurde.

          UNSINN hoch 10!!! Denn...

          > Speicher doch den User-Agent in der Session
          [ich zittiere mich selbst]
          > Weiß jemand, ob (und wie) das Problem auch lösbar ist ohne einen erneuten Aufruf der Seite?

          ...ja natürlich. Zum Teufel, es gibt doch nichts einfacheres als
          PHP-Code:
          session_unset(); session_regenerate_id(); 
          zu machen. Klappt auch bei session.auto_start = 1, was bei uns der Fall ist.

          Ich bin auch ein Dämmel (hier schüttele ich selbst ungläubig mit dem Kopf)

          Kein Wunder, dass Dir der Sinn der Weiche eigentlich nicht klar war. Wie solltest Du auch annehmen, dass ich auf so etwas grundlegendes nicht selbst komme.

          Verzeiht mir!!! Ich bin einfach überarbeitet. Und wegen der auto-Einstellung benutzen wir die Session-Funktionen ja seit Jahren gar nicht mehr.

          Zergling, Du hast was gut bei mir

          Kommentar


          • #6
            was ist whether()?

            signatur: string whether(b bool, s1 string, s2 string)
            gibt s1 zurück, falls b, sonst s2. Ein iff() gibt es in PHP ja nicht.

            .....

            Ich weiß nicht was du genau meinst aber ich glaub das hier!
            PHP-Code:
            <?php
            if ($b
            {
              
            $dein_wert $string1;
            }
            else
            {
              
            $dein_wert $string2;
            }
            ?>
            Ich glaube das meinst du mit iff() ... und äh das is schon bitter wenn du das nicht weißt!

            Kommentar


            • #7
              whether

              Genau genommen das hier:

              Code:
              function whether($condition, $trueValue, $falseValue)
              {
              	if ($condition)
              		return $trueValue;
              	else
              		return $falseValue;
              }
              Wenn man das nicht wüsste (eher könnte, hm?) würde man nicht programmieren können.

              Aber Du hast das irgendwie falsch verstanden.

              Das whether() ist das sonst in anderen Sprachen bekannte iff() (ich denke Visual Basic hatte so eine Funktion)

              Das Thema sollten wir denke ich jetzt abschliessen.

              Kommentar


              • #8
                Gut ich versteh nu was du meinst! Gibt dafür aber schon ne Abkürzung:
                PHP-Code:
                <?php
                $dein_wert 
                $condition $trueValue $falseValue;
                ?>
                Nur damit dus weißt dass es auch so geht

                Kommentar


                • #9
                  Ist unglaublich, was man hier während weniger Stunden an Knowhow ergänzen kann.

                  Ich benutze die Alternativsyntax schon sehr lange. aber bisher immer nur in der Form

                  (cond) ? stmt1 : stmt2;

                  Also ohne Rückgabewerte. Einmal so gesehen, kam ich über Jahre nie auf die Idee, das dieser Konstrukt die Werte auch zurückliefern könnte, denn ich dachte entweder statements oder values.

                  Wenn ich genau nachdenke, so gilt eigentlich eindeutig "values" (zwei Statements hintereinander geht ja nicht) und dass ich dabei immer nur Werte zugewiesen habe, ändert nichts daran. Man kann ja schliesslich auch schreiben

                  return ($r = $_REQUEST['whatever'])

                  Ich habe heute den Eindruck, man sieht oft vor lauter Bäume den Wald nicht. Und programmiert alles immer auf die selbe Art und Weise. Jahrelang. Weil man sich selten austauscht und selten auch fremde Codes sieht.

                  Kommentar


                  • #10
                    Zitat von stani
                    Zergling, Du hast was gut bei mir
                    Ich weiß grad garnicht wie ich dir geholfen habe, aber manchmal hilft laut
                    nachdenken ja ungemein

                    Kommentar


                    • #11
                      @stani: genau darum bin ich so gerne hier im Forum aktiv weil man immer wieder den Code von anderen sieht, die Ideen von anderen mitbekommt und deren Meinung hört. Dadurch hab ich schon viele bessere Wege gefunden Dinge zu realisieren als ich sie bis dato programmiert hatte! Das find ich das tolle an dem Forum.

                      Kommentar


                      • #12
                        dennoch mal meine Frage: Warum erlaubst du überhaupt die Übernahme von Sessions?

                        Finde das ist schon ne relativ problematische Sache. Ich schreibe in jede Session IP und Agent. Diese wird verglichen, stimmt da was nicht, wird die Session komplett getötet.
                        Damit schliesst man schon sehr viele Probleme.

                        Desweiteren habe ich bei Sicherheitsrelevanten Seiten sehr enge Timeouts. Entweder ist das Sesssionlimit kurz, was unter umständen zu Frust führt, oder aber die maximale Ruhezeit, also die Zeit zwischen 2 Seiteaufrufen. Mit 5 Minuten, bei arg kritischen Sachen sogar 2-3 Minuten ist das denke ich schon vertretbar.

                        Meine Bank kickt mich ja auch wenn ich nur wenige Minuten nix mache.

                        Und wenn bei die sowas schon zufällig passiert, wie stehst du dann da, wenn es jemand drauf anlegt?

                        Habe nen Kunden, der immer noch der Meinung ist, sein Webshop ist sicher, obwohl ich ihm in 2 Minuten gezeigt habe, wie einfach eine Sessionübernahme geht (auch ohne Wissen der SessionID)

                        Da war ich dann Admin in seinem Adminshop, da könnte ich nicht drüber lachen.

                        Kommentar


                        • #13
                          RaZoR: Jaaa, ich denke, ich schaue hier nun auch öfter vorbei und lese auch ein wenig. Du hast da sicher Recht. Es ist keine Kunst, dumm zu sterben.

                          CC84: Die Übernahme wollte ich eben verhindern. Ich denke, IP und Agent in die Session zu schreiben macht echt Sinn. Ich werde das weitergeben, damit wir den SessionManager entsprechend erweitern. Mir war das schon lange ein Dorn im Auge. Is ja schnell gemacht.

                          Aber wenn wir schon über Sicherheit sprechen. Wie würdet Ihr kritische Daten auf dem Server handhaben? Ich habe einen Kunden, der gerne Teile der Datenbank verschlüsseln würde. Sehr kritische Daten, dürfen nicht an die Konkurrenz. Ok ok. Problematisch nur, dass man letztendlich auf dem Server ja auch entschlüsseln möchte. Also... wenn ein Hacker da reinkommt, dann findet er erst Recht, wie die Daten entschlüsselt werden.

                          Wie würden Ihr denn so etws angehen? (Das Verschlüsseln, nicht das Hacken!!!)

                          Kommentar


                          • #14
                            Erstmal würde ich dir raten da nen neuen Thread zu aufmachen.

                            Ansonsten sehe ich das genau so wie du. Du kannst die Daten bestenfalls auf ne verschlüsselte Platte packen, damit sind die Daten dann sicher, wenn der PC aus ist, bis jemand eben das PW zum entschlüsseln eingibt. Ansonsten kannst du Sicherheit nur dadurch erreichen, dass du eben dafür sorgst, dass keiner auf den Server kommt. Alles andere ist eher lachhaft, weil du immer ein PW brauchst, um an die Daten zu kommen und das muss ja nunmal irgendwo liegen ^^.

                            Kommentar


                            • #15
                              Re: whether

                              Zitat von stani
                              Genau genommen das hier:
                              Das tut auch nix anderes als das:

                              Code:
                              $irgendwas = ($condition) ? $trueValue : $falseValue;

                              Kommentar

                              Lädt...
                              X