Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem bzg. überschreiben von Sessions

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Problem bzg. überschreiben von Sessions

    Liebes Forum,

    vermutlich wurde die Frage schon gefühlte eine Million mal gestellt und wenn es so ist (was wahrscheinlich tatsächlich der Fall sein wird) möchte mich schon mal in aller Form entschuldigen

    Es geht um Sessions. Um genauer zu sein, darum, dass eine Session quasi "überschrieben wird".

    Folgendes Problem:
    Ich habe ein kleines Backend geschrieben, das - eigentlich - mehrere User unterstützen sollte, was es theoretisch auch tut. Die User lege ich im Moment noch in der DB an (das macht also kein Script).

    Die Tabelle hat folgende Struktur:
    ID
    user
    password
    isAdmin
    isSuperUser
    Title

    Jeder User kann sich mit seinen eigenen ganz individuellen Daten einloggen und das Panel benutzen. Das Problem ist, dass alle User, die Rechte des ersten Users übernehmen.

    Als Beispiel:
    - Ich erstelle als ersten User "Administrator", er hat die Flag "isAdmin" auf "1"
    - Ich erstelle einen weiteren User mit dem Namen "Moderator", der nun - trotz isAdmin-Flag auf "0", alle Rechte des ersten Users übernimmt, quasi eigentlich seine Session - bis auf die Einloggdaten.

    Weiteres Beispiel:
    - Jeder User hat einen Titel, also z.B "Ingame Administrator", "Server Administrator" etc. Wenn nun der User "Administrator" den Titel "Server Administrator" hat, hat "Moderator" ihn dann auch.

    Codebeispiele (Hierbei sei ein Danke an den User ugurkankaya aus dem WoltLab Forum gerichtet, der mir den Code zum Teil umgeschrieben hat, was ich aber tatsächlich nicht suche, weil ich etwas lernen möchte!)

    index.php
    Auschnitt vom Login-Formular:
    Code:
    <p align="center"><img src="styles/images/logo.png" alt="Logo" /></p>
    <h2 align="center">Admin Control Panel</h2>
    <center>
    <form action="acp_login.php" method="post">
    <b>Username</b>:
    <br />
    <input type="text" name="user">
    <br />
    <b>Password</b>:
    <br />
    <input type="password" name="password">
    <br />
    <input type="submit" value="login"/>
    <input type="hidden" name="<?php session_name();?>" value="<?php echo session_id();?>" />
    <br />
    </form>
    </center>
    acp_login.php
    PHP-Code:
    <?php
    require_once 'config.inc.php';
    session_start();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head><link rel="stylesheet" type="text/css" href="styles/acp_standard.css" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Please login!</title>
    </head>
    <body>
    <?php
    if($_POST) :
    $user=trim(strip_tags(mysql_real_escape_string($_POST["user"])));
    $password=trim(strip_tags(mysql_real_escape_string($_POST["password"])));
    $password_hash=md5($password);
    if(empty(
    $user) || empty($password) )
    {
    echo 
    "The fields may not be empty!";
    }else
    {
    $var_query=mysql_query(
    "SELECT user, password FROM staff_users WHERE user = '$user' && password = '$password_hash'"
    );
    $total_count=mysql_num_rows($var_query);
    if(
    $total_count!=0)
    {
    $object_get=mysql_fetch_object($var_query);
    $_SESSION["user"]=$object_get->user;
    header("Location:acp_index.php");
    exit();
    }else
    {
    echo 
    '
    <div class="content">
    Username or password wrong !
    <br />
    <a href="index.php">&raquo; Back</a>
    </div>
    '
    ;
    }
    }
    endif;
    echo 
    '</body>';
    echo 
    '</html>';
    in jeder Datei am Anfang
    PHP-Code:
    $user trim($_SESSION["user"]);
    if (empty(
    $user) || !isset($user)) {
        
    header("Location:index.php");
        exit();

    Könnte mir da bitte jemand helfen? Das wäre sehr lieb. Ich hab's echt versucht und nicht auf die Reihe bekommen. Auch grobe Hinweise genügen! Ich möchte bei der Sache ja schließlich was lernen.

    Vielen Dank

  • #2
    Hallo,
    an welcher Stelle werden die Berechtigungen zugeteilt?
    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

    Kommentar


    • #3
      Abend VPh,

      die Abfragen für die Berechtigungen liegen in der config.inc.php. Hab da die meisten Quieres ausgelagert.

      PHP-Code:
      // get isAdmin
      $isAdmin = @mysql_query("SELECT isAdmin FROM staff_users"); list($isAdmin) = @mysql_fetch_row($isAdmin); 
      und

      PHP-Code:
      // get isSuperUser
      $isSuperUser = @mysql_query("SELECT isSuperUser FROM staff_users"); list($isSuperUser) = @mysql_fetch_row($isSuperUser); 
      die Rechte überprüfe ich mit normalen if-Bedingungen.
      Also ..
      if($isSuperUser == 1) {
      } else {
      }

      Gespeichert werden die Rechte wie bereits erwähnt in der DB-Tabelle.

      Kommentar


      • #4
        Njo, hab nicht wirklich Lust zu raten was da noch irgendwo für Code sein könnte... ich denke du solltest bei den Berechtigungen die User-ID/Usernamen/Whatever in die Where-Klausel als Suchkriterium reinnehmen.

        Tipp was du dir noch ansehen solltest, zum Thema Datenbankdesign: Normalisierung.

        Standardtext für die Datenbankverbindung:
        Die mysql_* Erweiterung ist veraltet und wird in der nächsten PHP-Version entfernt. Zudem ist deine Query anfällig für SQL-Injections.
        Durch einen Wechsel auf mysqli_* oder PDO greifst du aufdie modernere API zu und hast die Möglichkeiten Prepared Statements zu benutzen die gegen Injections wirken.
        Ich persönlich bevorzuge PDO, schönes Tutorial: http://www.peterkropff.de/site/php/pdo.htm
        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

        Kommentar


        • #5
          Du sollst auch nicht raten! Was brauchst Du genau? Dann zitiere ich es auch noch.
          Und danke für den Sicherheitshinweis.

          Kommentar


          • #6
            Wenn die Zuweisungen der Berechtigungen in der config.inc stattfindet, machst du das ja schon bevor überhaupt festegesellt wird, welcher User es überhaupt ist.
            Du musst deinen Programmablauf anders strukturieren.
            PHP-Code:
            "SELECT user, password FROM staff_users WHERE user = '$user' && password = '$password_hash'" 
            Nimm deine Berechtigungsfelder in diese Abfrage mit auf.
            PHP-Code:
            if($total_count!=0)

            Und hierhin verschiebst du die Berechtigungsprüfungen, die du leicht anpassen müssen wirst.
            [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
            [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

            Kommentar


            • #7
              Danke für deine Hilfe. Ich werde deinen Tipp beherzigen und mir nochmal genau den Code anschauen. Wenn ich das Problem dann gelöst habe, poste ich es hier für die Anderen!

              Danke Dir.

              Kommentar


              • #8
                Guten Abend liebes Forum,

                trotz der Hilfe von VPh bekomme ich es leider nicht hin. Das Problem bleibt leider weiterhin bestehen.

                Ich möchte gerne nochmals genauer erläutern, wie das Script funktioniert.

                1. Aufbau der Tabelle "staff_users"


                2. Ich weiß, dass ich diese Quieries nicht auslagern soll, jedoch hat es bei mir auch anders rum nicht funktioniert, weil ich es wohl einfach falsch mache: Wo liegen die Abfragen für die Rechte? im Config-File (wo sich auch alle anderen user-relevanten Abfragen befinden).
                PHP-Code:
                // get isAdmin
                $isAdmin = @mysql_query("SELECT isAdmin FROM staff_users"); list($isAdmin) = @mysql_fetch_row($isAdmin);

                // get isSuperUser
                $isSuperUser = @mysql_query("SELECT isSuperUser FROM staff_users"); list($isSuperUser) = @mysql_fetch_row($isSuperUser); 
                3. Überprüfung der Rechte
                in Dateien wo ich möchte, dass nur entweder der Admin und/oder der Super-
                User Zugriff auf bestimmte Funktionen haben, benutze ich eine einfache if-Abfrage:
                PHP-Code:
                if($isAdmin == 1){
                }else{

                Für einen User funktioniert das alles wunderbar. Aber in den Moment wo ich einen weiteren User hinzufüge, übernimmt in 99% der Fälle der neue User, die Rechte - ja ich glaube sogar die Session des Ersten.

                4. Das wird an folgendem Beispiel deutlich ..

                Es gibt in der obigen Tabelle die Spalte "Title", der schlicht den Benutzertitel darstellt.

                In der Benutzerübersicht in meinem Script wird dieser auch korrekt dargestellt


                Doch als eigener Titel auf der Startseite, wenn man sich gerade eingeloggt hat, hat man den Titel des ersten Users


                Mein Verdacht ist also, dass man seine Session übernimmt, obwohl man sich problemlos mit seinen eigenen Daten einloggen kann.

                Meine Fragen:
                1. Muss ich die Session näher spezifizieren?
                2. Hat das Ganze was mit register_globals = off zu tun? (Ich weiß, sollte off bleiben)
                3. Sollte ich die beiden Flags (also isAdmin und isSuperUser) in einer seperaten Table auslagern?
                4. Hat das ganze überhaupt was mit den Berechtigungen zu tun, oder tatsächlich mit der Session?

                Ich weiß gerade nicht, welche Zeilen ich explizit kommentieren soll. Aber bitte schreibt mir welche Zeilen gebraucht werden und ich werde sie hier kommentieren.

                Ich wäre für jede Hilfe sehr dankbar,
                schönen Abend

                Kommentar


                • #9
                  PHP-Code:
                  $isAdmin = @mysql_query("SELECT isAdmin FROM staff_users"); list($isAdmin) = @mysql_fetch_row($isAdmin); 
                  Für einen User funktioniert das alles wunderbar. Aber in den Moment wo ich einen weiteren User hinzufüge, übernimmt in 99% der Fälle der neue User, die Rechte - ja ich glaube sogar die Session des Ersten.
                  Vollkommen klar, du fragst ja auch ALLE Datensätze ab, nicht nur den des speziellen (eingeloggten) Users.

                  PHP-Code:
                  "SELECT user, password FROM staff_users WHERE user = '$user' && password = '$password_hash'" 
                  Das ist dein Login-Query... warum selektierst du dort nicht sofort auch "isAdmin" mit? Würde alle deine Probleme sofort lösen, du hättest den korrekten Wert für den eingeloggten User und müsstest keine zweite Query absetzen.
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    Hallo lstegelitz,
                    vielen lieben Dank für deine Hilfe.
                    Macht natürlich völlig Sinn, hätte ich selbst drauf können müssen. -_-

                    Inwieweit müsste ich den Query anpassen? Also quasi nur beim SELECT isAdmin, isSuperUser, Title hinzufügen? Auch auf die Gefahr hin, mir jetzt mit der Fragestellung "Freunde zu machen".

                    Weil er mir dann das Warning:
                    Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given
                    ausspuckt.

                    Kommentar


                    • #11
                      Also quasi nur beim SELECT isAdmin, isSuperUser, Title hinzufügen?
                      Ganz genau.

                      Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given
                      Lass dir das Query ausgeben und probier es im PHPMyAdmin aus, wenn du es schon nicht hier reinstellen willst...
                      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                      Kommentar


                      • #12
                        Sinnvollerweise liest man die Rechte gleich im selben Atemzug ein, in dem auch das Login stattfindet. Oder Du referenzierst den User in der Session über eine ID und fragst dann in jedem Scriptcall den entsprechenden Userdatensatz aus der DB ab.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          3. Sollte ich die beiden Flags (also isAdmin und isSuperUser) in einer seperaten Table auslagern?
                          Mittelfristig ja. Obwohl Dein Rechtemanagement ohnehin eher rudimentär ist.
                          [COLOR="#F5F5FF"]--[/COLOR]
                          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                          [COLOR="#F5F5FF"]
                          --[/COLOR]

                          Kommentar


                          • #14
                            @lstegelitz
                            Ich zitiere es gleich nochmal (sorry, dass ich es nicht gemacht habe)

                            @nikosch
                            Danke für die Ehrlichkeit. Ich gelobe Besserung, soweit ich es jetzt hinbekommen habe.

                            Edit: War leider behindert gestern - ich probiere jetzt erstmal eure Lösungswege aus. Danke soweit.

                            Kommentar


                            • #15
                              Ich glaub, ich grab mich ein. Ich hab noch viel zu lernen..
                              Hatte im Config-File, wo ich die Rechte abfrag, das WHERE vergessen -_-

                              Naja, lagere es jetzt auch nicht mehr in der Config aus.

                              Danke für die Hilfe ..
                              Schönen Abend noch!

                              Kommentar

                              Lädt...
                              X