Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Authentifizierung ohne Session überprüfen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Authentifizierung ohne Session überprüfen

    Hallo zusammen,

    Ich stehe vor folgendem Problem:

    Ich habe ein kleines Portal entwickelt, wo ein Nutzer je nach Berechtigung verschiedene Links zu anderen Anwendungen angezeigt bekommt.
    Nun können Nutzer bei Kenntniss des Links auch so auf die Anwendung zugreifen, und das möchte ich gerne unterbinden.

    Auf Anhieb fallen mir da zwei Möglichkeiten ein:
    1. Möglichkeit:
    Ich leite nicht direkt über den link, sondern über eine "weiterleitungsdatei" und stelle in der Anwendung z.b. über htaccess ein, dass nur verbindungen von dem referrer angenommen werden.
    Diese möglichkeit ist aber ziemlich unsicher, und deswegen nicht wirklich sinnvoll zu nutzen.

    2. Möglichkeit:
    Die Anwendung überprüft selbst nochmal, ob der Nutzer berechtigt ist, auf die Anwendung zuzugreifen. Das wäre dann relativ sicher, aber sehr umständlich, jede Anwendung da nochmal anzupassen.


    Daher nun meine Frage: Wie kann ich auf möglichst einfache Weise das System absichern?

    Besten Dank schonmal!


  • #2
    Was ist denn eine Anwendung bei dir? Du solltest schon bei immer überprüfen ob der User berechtigt ist, Referer kann man beliebig einstellen, von daher auch keine Hürde.

    Kommentar


    • #3
      Was spricht denn gegen Sessions? Und was hat das mit Deinem Problem zu tun?

      Kommentar


      • #4
        Deiner Fragestellung nach willst du Sessions.

        Kommentar


        • #5
          Also Anwendungen sind bei mir zum Beispiel eigenständige php-projekte, wie Reportgeneratoren, Berechnungen, etc.


          Im Prinzip bin ich auch für Sessions (nutze ich ja schon in dem Portal), weil das mit dem referer einfach zu unsicher ist. Aber es ist recht aufwändig die überprüfungen in die einzelnen Anwendungen einzubauen, weshalb eine einfachere Möglichkeit nicht schlecht wäre.

          Also gibt's sozusagen keine einfachere (und trotzdem sichere) Möglichkeit als Sessions, die Anwendungen so zu sperren, dass diese nur mit einem im Portal authentifizierten Benutzer freigeschalten sind?

          Kommentar


          • #6
            Ich verstehe das Problem nicht. Du müsstest doch auch überall der Referrer prüfen, oder nicht?

            Kommentar


            • #7
              Das schreit doch geradezu nach Sessions
              Wenn du solche Sachen nicht immer doppelt und dreifach schreiben möchtest kommst du wohl an der OOP nicht vorbei. Einfach eine Basisklasse mit deinen Überprüfungen im constructor schreiben, alle betroffenen Klassen davon erben lassen. Fertig

              Kommentar


              • #8
                Zitat von ppan1006 Beitrag anzeigen
                Also gibt's sozusagen keine einfachere (und trotzdem sichere) Möglichkeit als Sessions, die Anwendungen so zu sperren, dass diese nur mit einem im Portal authentifizierten Benutzer freigeschalten sind?
                Als Teil eines "Portals" musst du zwar kein Login realisieren, aber es muss einen Handshake zwischen dir und dem Portal geben - im Endeffekt muss DEINE Software entscheiden, ob sie einen Portal-User mit einem bestimmten Token vorbeilässt oder nicht.
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Das einfachste erscheint mir hier schon eine Überprüfung der Session. Ob du jetzt in deinen Anwendungen überall auf die Sesssion prüfst oder auf den Referer kommt vom Codeaufwand eh aufs selbe raus!

                  Kommentar


                  • #10
                    Du musst ja überall prüfen, wo du den Zugang nicht jedem gewähren willst. Du kannst dir auch eine kleine Bibliothek schreiben die das macht. Einmal zentral geladen könnte man so die Abfrage in einem Einzeiler unterbringen.

                    Angenommen das Objekt der Bibliothek nennst du $foo. Dann könntest du mit einem Methodenaufruf wie z.B. $foo->isLoggedIn direkt den Status ausgeben lassen. Diesen Status schreibst du per setter in die Eigenschaft "isLoggedIn" der Bibliothek.

                    Ansonsten dürfte die ACL (Access Control List) auch eine Interessante Thematik für dich sein.

                    Kommentar


                    • #11
                      Besten Dank für eure Hilfen!

                      Ich hab mich jetzt für Sessions entschieden. Die Anpassungen halten sich da auch in Grenzen und ist einfach das sicherste.

                      Ich machs jetzt so, dass ich im Portal eine kleine Datei abgelegt habe - die checkuser.php.
                      In dieser Datei gibt es eine Funktion checkuser mit dem Paramater "application_id". Hat der Nutzer zugriff auf die übergebene application_id, liefert die Funktion ein true zurück, andernfalls ein false.

                      Jetzt binde ich einfach in jede Anwendung mit require die checkuser.php ein, und arbeite dann halt mit if (checkuser(app) === true) dann zeigt er den rest der anwendung an, ansonsten nicht.

                      Leider funktioniert das auch nicht so wirklich.
                      Die Funktion checkuser liest Daten aus einer Datenbank aus. Wenn ich jetzt die Funktion aus einer Anwendung heraus aufrufe, funktioniert das mysql_query nicht. Es wird keine Ressource erstellt.
                      Rufe ich aber die selbe Funktion, mit den selben Parametern aus der checkuser.php heraus auf, funktioniert es bestens.

                      Also Kurz: Wenn ich eine Funktion extern aufrufe funktioniert mysql_query nicht, rufe ich es intern auf, funktionierts.


                      Ich hoffe, ich konnte es einigermaßen verständlich beschreiben
                      Und danke nochmal für eure hilfe!

                      Kommentar


                      • #12
                        War das jetzt eine indirekte Frage!? Wenn ja, poste sonst deinen aktuellen Code mal.

                        Wolf29
                        while (!asleep()) sheep++;

                        Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                        Kommentar


                        • #13
                          Ohne Code ists schwierig zu beschreiben ^^
                          Also hier nochmal mit


                          Das ist meine checkuser.php:
                          PHP-Code:
                          <?
                          function checkuser($application_id)
                          {
                              session_start();
                              $user_id = $_SESSION['user_id'];
                              
                              include('config.php');
                              $connection = mysql_connect ($DB_Server, $DB_Username, $DB_Password); 
                              if (!mysql_select_db ($DB_DBName, $connection)) 
                              { 
                                die ("Keine Verbindung zur Datenbank"); 
                              } 

                              $sql = ("SELECT `$application_id` FROM `permissions` WHERE `user_id` = '$user_id'"); 
                              $result = mysql_query($sql);
                              
                              if ( $permission = mysql_fetch_row($result) )
                              {
                                  if ( $permission[0] == "1" )
                                  {
                                      mysql_close($connection);
                                      return true;
                                  }
                                  else
                                  {
                                      mysql_close($connection);
                                      return false;
                                  }
                              }
                              else
                              {
                                  mysql_close($connection);
                                  return false;
                              }
                          }
                          ?>
                          Die andere Datei liegt zum Beispiel unter /usr/share/webapp/www/
                          In dieser Anwendung hab ich die Authentifizierung dann so realisiert (oder würde es gerne ^^)

                          PHP-Code:
                          <?php
                          require('/var/www/checkuser.php');

                          if ( 
                          checkuser(11) === true )
                          {
                          //alles anzeigen
                          }
                          else
                          {
                          echo(
                          "Fehlende Berechtigung");
                          }
                          ?>
                          Wenn ich nun die Anwendung ausführe, kommt der Fehler
                          Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /var/www/checkuser.php on line 17
                          Und beim Debugging habe ich festgestellt, dass die Variable $result in der checkuser.php leer bleibt, also mysql_query nicht funktioniert.


                          Rufe ich allerdings die Funktion direkt in der checkuser.php auf, funktioniert das ohne Probleme.


                          EDIT: achso, und ja, es war ne Frage ^^



                          EDIT: Hab jetzt grade den Fehler gefunden. Der include der config.php bezieht sich ja nicht auf den Pfad der checkuser.php sondern, dann auf die config der Anwendung. Muss also bei der config.php mit nem absoulten und keinem relativen Pfad arbeiten

                          Kommentar


                          • #14
                            Liegt die checkuser.php im gleichen Verzeichnis wie die andere Datei? Wenn nicht, dann dürfte
                            PHP-Code:
                            include('config.php'); 
                            das Problem sein.

                            Kommentar


                            • #15
                              Japp, war das Problem ^^ Hab das Problem auch grad gefunden gehabt, als du geposted hast

                              Damit funktioniert das jetzt so wie's soll Gibt zwar sicherlich bessere und sicherere Methoden, aber für meine Zwecke reicht das erstmal.

                              Kommentar

                              Lädt...
                              X