Andere Session manipulieren?

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

  • Andere Session manipulieren?

    Salute a tutti!

    Ich entwickle eine Benutzerverwaltung in PHP.
    Bei dieser Benutzerverwaltung wird der Status eines Besuchers (eingeloggt oder nicht) in der Session gespeichert.

    Alle benutzerbezogenen Daten in der Session werden nach einer konfigurierbaren Zeitspanne neu von der Datenbank gelesen:
    PHP-Code:
    function logged_in() {
      
    $time time();
      if (
    $_SESSION['last_check'] + self::CHECK_INTERVAL $time)
        return 
    $_SESSION['logged_in'];
      
    //Abfrage der Datenbank
      
    $_SESSION['last_check'] = $time;
      return 
    $_SESSION['logged_in'];

    Eine Anforderung ist jetzt, dass entsprechend berechtigte Benutzer andere Benutzer aus dem System kicken (=sperren) können.
    Ich kann natürlich die entsprechenden Änderungen in der Datenbank vornehmen (Benutzer sperren und als abgemeldet kennzeichnen), aber...

    Der Benutzer selbst bekommt davon ja für schlimmstenfalls self::CHECK_INTERVAL Sekunden nichts mit.
    Ich suche also nach einer Möglichkeit, die Session des Benutzers zu bearbeiten (logged_in auf false setzen, forced_logout auf true setzen)

    Mir ist dazu bis jetzt nur folgendes eingefallen:
    PHP-Code:
    function lock_user($id) {

      
    $this->lock_user_db($id);

      
    $user_session $this->get_session_id_of_user($id);
      if (!
    $user_session) {
      
    //user is not currently logged in
        
    return;
      }

      
    $own_id session_id();


      
    //save own session data
      
    session_write_close();

      
    //open user's session
      
    session_name(self::SESSION_NAME);
      
    session_id($user_session);
      
    session_start();

      
    //do the needed changes to the user's session
      
    $_SESSION['logged_in'] = false;
      
    $_SESSION['forced_logout'] = true;

       
    //restore own session
      
    session_write_close();
      
    session_name(self::SESSION_NAME);
      
    session_id($own_id);
      
    session_start();

    Das funktioniert soweit einwandfrei, ich mache mir nur Sorgen, dass das unter bestimmten Umständen Probleme beim Einsatz von Frames machen könnte.

    Wer beruhigt mich?
    Wer sagt mir wie's sonst gehen könnte?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    Re: Andere Session manipulieren?

    Wieso soll das mit Frames Probleme geben?


    Andere Möglichkeit:
    Eine Seite mit Benutzerverwaltung hat sicher irgendwoher Konfigurationsparameter, sei es aus einer Datei oder der DB.

    Sobald ein Benutzer gesperrt wird, schreibst du dorthin ein Flag. Die Konfig wird bei jedem Aufruf gelesen, das Flag steht also ohne weiteres zur Verfügung.

    Nun änderst du logged_in() etwa so:
    Wenn Flag nicht gesetzt
    so wie bisher (Session prüfen)
    Sonst
    Login über DB prüfen (liefert 'kicked')
    wenn kicked, dann kill Session und logout


    Effekt: Du mußt nicht mehr in die Session des zu kickenden Users schreiben, da sich dessen Session von selbst pulverisiert, sobald das nächste Mal sein Loginstatus geprüft wird.

    Kommentar


    • #3
      Was ich mir mit den Frames gedacht habe, weiß ich gar nicht mehr so genau...
      Wenn du das für abwegig hältst, ist mir damit auch geholfen.


      Zu dem Flag in der Konfigurationsdatei:

      Theoretisch gibt es da ja nur die Alternativen entweder ein Flag je User zu haben oder ein Flag für alle User und die gesperrten User-IDs alle dahinterzuschreiben

      Ein Flag je User gefällt mir gar nicht.
      Ein Flag der Art users_logged_out_by_admin=5,78,9,23 dagegen könnte mir gefallen, da würde mich nur stören, dass ich diese Datei bei wirklich jedem Request dahingehend durchsuchen müsste.
      Naja, muss ich mal richtig drüber nachdenken, danke.
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Ich meinte eher ein Flag dirty=true ohne Bezug auf spezielle User.

        Kommentar


        • #5
          Angenommen, es gäbe 5 User (IDs 1 - 5)

          Der Admin, der User sperren darf, hat die ID 1.
          Sperrt dieser die User 3 und 5 wird das Flag "dirty" auf "X" gesetzt

          Kommt jetzt User 2, wird das Flag ausgewertet, die DB wird ausgelesen und da User 2 nicht gesperrt ist, wird das Flag nicht geändert.

          Als nächstes kommt User 3 daher, das Flag wird ausgewertet, die DB wird ausgelesen und da User 3 gesperrt ist wird er ausgeloggt.

          Jetzt wird's spannend:
          Setze ich das Flag zurück, freut sich User 5.
          Wenn ich - User 5 will ich ja auch noch kriegen - das Flag nun nicht zurücksetze, wann dann?

          Zurücksetzen dürfte ich es erst dann, wenn der letzte gesperrte aber angemeldet User die Seite einmal aufgerufen hat und das kann dauern.
          Etwas weniger lang würde es vermutlich dauern, wenn ich den Zeitpunkt der letzten Aktion dieser User auslese und prüfe, ob er länger als self::CHECK_IDLE her ist.

          Oder sehe ich da was nicht?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Naja dann setze halt dirty=time() wenn du jemanden kickst und ...
            PHP-Code:
            function new_logged_in() {
              
            // niemand gekickt
              
            if ($dirty === false) {
                return 
            logged_in();
              
            // Kick ist lange her, Login wird sowieso über DB geprüft
              
            } elseif ($dirty +self::CHECK_INTERVAL time()) { 
                
            write_config('dirty'false);  // Flag zurücksetzen
                
            return logged_in();
              
            // jmd. wurde vor kurzem gekickt, Login über DB
              
            } else {
                
            //Abfrage der Datenbank
                
            $_SESSION['last_check'] = $time;
                return 
            $_SESSION['logged_in'];
              }

            Kommentar


            • #7
              Schick!

              Ich werd's wohl so machen, auch wenn ich mich damit schwertue
              Schließlich bin ich momentan noch ganz schön stolz auf mich und deine Variante scheint mir mehr Schreib/- Lesearbeit mit sich zu bringen.

              Mir ist bei meiner Sache nämlich aufgefallen, dass ich die geänderte Session zwar wieder speichere, ich aber nicht weiß, ob mein geändertes Array nicht vll. überschrieben wird, wenn der Request des betroffenen Users vor dem Sperren anfängt und nach dem Sperren weitergeht.
              Wenn mir da jemand glaubhaft versichern kann, dass die Sorge unbegründet ist, bleibe ich bei meiner Methode.

              Danke auf jeden Fall, Gehirnstürme sind toll, auch wenn nicht gar so viele pusten...
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar

              Lädt...
              X