Stefan E: Passwortschutz mit PHP sicher?

Hallo zusammen
Ich möchte einen Passwortschutz mittels PHP realisieren, welcher am Anfang jeder Seite included wird.
Der Passwortschutz überprüft ob eine Session besteht. Wenn nicht wird eine Loginmaske angezeigt und nachher der PHP Befehl exit ausgeführt welcher das weiter Aussführen PHP unterbricht. und nach der Eingabe der Userdaten wird überpfrüft ob die Logindaten mit den gespeicherten Daten aus dem config File übereinstimmen (Passwort evtl. md5 verschlüsselt).
Wenn nun die Eingabe stimmt wird eine Session gestartet und der User kann normal weiter Serven.

Noch einmal schematisch Aufgezeigt:

irgend_eine_datei.php
<code>
<?php
  include("security.php");
  der restliche code;
?>
</code>

security.php
<code>
<?php
  session!=ok {
    loginmaske();
    exit;
  }
?>
</code>

mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??

vielen Dank für eure Mühe.

  1. Hi,

    mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??

    ich bin mir nicht sicher, aber ich denke das ein header("Location: ..") sicherer ist.

    MfG

    1. Hi Daniel,

      ich bin mir nicht sicher, aber ich denke das ein header("Location: ..") sicherer ist.

      Wie kommst du auf diese - sorry, blöde - Idee? Dann bräuchte man doch nur die direkte URL kennen, diese in den Browser eintippen und schon wäre man auf der geschützten Seite. Und glaube mir: Es ist überhaupt nicht schwer festzustellen, was du für eine URL bei Location angegeben hast.

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      „Von rechts ein Trabbi und von links auch frei!” *g*
      1. Hi,

        Wie kommst du auf diese - sorry, blöde - Idee? Dann bräuchte man doch nur die direkte URL kennen, diese in den Browser eintippen und schon wäre man auf der geschützten Seite. Und glaube mir: Es ist überhaupt nicht schwer festzustellen, was du für eine URL bei Location angegeben hast.

        ich glaube du hast mich falsch verstanden, er soll ne weiterleitung zu
        loginmaske machen anstatt sie zu includen und das script der aktuellen seite mit exit() zu beenden.

        MfG

        1. Hi Daniel,

          ich glaube du hast mich falsch verstanden, er soll ne weiterleitung zu
          loginmaske machen anstatt sie zu includen und das script der aktuellen seite mit exit() zu beenden.

          Ok, trotzdem darf dieses Statement nicht unkommentiert stehen bleiben, damit kein später im Archiv Lesender es mißversteht.

          Ja, auf die Loginmaske umzuleiten würde gehen und hat insofern den Vorteil, dass man nicht in jeder Datei das Login Formular notieren bzw. includen muss. Trotzdem hat die von Stefan gewählte Methode (sofern nicht irgendwie das exit; verloren gegangen ist) von der Sicherheit her keinen Nachteil gegenüber einem Location Header.

          MfG, Dennis.

          --
          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
          Werbung ist der Versuch, das Denkvermögen des Menschen so lange außer Kraft zu setzen, bis er genügend Geld ausgegeben hat. (Ambrose Bierce)
          1. Moin!

            Ja, auf die Loginmaske umzuleiten würde gehen und hat insofern den Vorteil, dass man nicht in jeder Datei das Login Formular notieren bzw. includen muss.

            Die Prüfung, ob der Benutzer angemeldet ist, muß trotzdem überall includiert werden. Wo ist dann der Vorteil?

            Trotzdem hat die von Stefan gewählte Methode (sofern nicht irgendwie das exit; verloren gegangen ist) von der Sicherheit her keinen Nachteil gegenüber einem Location Header.

            Richtig. Und sie hat den Vorteil, dass man auf der gleichen Seite bleiben kann und diese nach erfolgter Anmeldung direkt sieht. So werden Bookmarks auf Unterseiten möglich, die man immer direkt anspringen kann, egal ob man schon angemeldet ist, oder nicht.

            Bei einem Sprung auf eine Anmeldeseite müßte diese dann ihrerseits wieder zurück zur gewünschten und vorher angeforderten Seite springen.

            • Sven Rautenberg
            1. Vielen Dank für eure zahlreichen und guten Antworten.
              Ich werd es mit der exit Variante programmieren. Ich war mir nur nicht sicher ob das exit total sicher ist. man kann ja immer noch nach dem exit eine header("Location: ...") machen fals das exit versagt hat, was ja aber nicht passieren sollte.

              1. Hi Stefan,

                Ich war mir nur nicht sicher ob das exit total sicher ist. man kann ja immer noch nach dem exit eine header("Location: ...") machen fals das exit versagt hat, was ja aber nicht passieren sollte.

                Joa, klar, kannst du das machen, sei dir aber bewusst, dass nach header("Location: ..."); das Script _keinenfalls_ direkt abgebrochen wird! Im Gegenteil, das Script wird noch weiter durchgearbeitet, was du z.B. dann merkst, wenn du nachher noch eine Datenbank Operation durchführen lässt oder so etwas. Nach einem Header Location sollte also im Normalfalls sowieso ein exit; kommen (wenn du nicht wirklich noch das Script was machen lassen willst).

                MfG, Dennis.

                --
                Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
                Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. (Albert Einstein)
  2. mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??

    Hallo Stefan

    Ja. Du solltest aber darauf achten, dass, wenn die security.php nicht gefunden wird, das script abgebrochen wird, also z.B.

    @include('security.php') or die('anmeldedatei nicht gefunden. bitte webmaster kontaktieren');

    übrigens: <code> bringt dir hier nix, weil html-tags nicht erkannt werden. nimm stattdessen (eckige klammer)code lang=php] und (eckige klammer)/code]

    Marian

    1. Hi Marian,

      Ja. Du solltest aber darauf achten, dass, wenn die security.php nicht gefunden wird, das script abgebrochen wird, also z.B.

      Richtig, aber...

      @include('security.php') or die('anmeldedatei nicht gefunden. bitte webmaster kontaktieren');

      So kompliziert brauchst du es gar nicht machen - den PHP kennt hierzu schon die Funktion require(), da gibt einen Fatal Error wenn die Datei nicht existiert und nicht wie bei include() nur eine Warning.

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Krieg ist Gottes Art, den Amerikanern Geographie beizubringen. (Häfft)
  3. Ich möchte einen Passwortschutz mittels PHP realisieren, welcher am Anfang jeder Seite included wird.
    Der Passwortschutz überprüft ob eine Session besteht. Wenn nicht wird eine Loginmaske angezeigt und nachher der PHP Befehl exit ausgeführt welcher das weiter Aussführen PHP unterbricht. und nach der Eingabe der Userdaten wird überpfrüft ob die Logindaten mit den gespeicherten Daten aus dem config File übereinstimmen (Passwort evtl. md5 verschlüsselt).

    mein Frage nun. Ist das ganze sicher, wenn die security.php zuoberst in jeder Datei eingebunden wird und am ende der Loginmaske mit exit das ganze Script gestoppt wird??

    Also ich hab sowas auch gemacht. Ich speichere das passwort und den name als cookie(das passwort natürlich md5) und include das login.inc.php einfach.

    login.inc.php
    <?php

      
    $username = $_COOKIE['username'];  
    $password = $_COOKIE['password'];  
    if(!empty($_POST['username']))  
      $username = $_POST['username']; //formular-wert überschreibt cookie  
    if(!empty($_POST['password']))  
      $password = md5($_POST['password']);  
      
    //testen, ob $password zu $username passt (z.b. datenbank)  
    $logged = $password == $wie_es_sein_sollte; // (beides ist md5-verschlüsselt)  
      
    if($logged)  
    {  
     setcookie('username', $username);  
     setcookie('password', $password, 300); //verfällt nach 5 minuten  
     if(!empty($_POST['password']))  
       echo '<script type="text/javascript">window.alert("Sie wurden angemeldet")</script>';  
    //nur wenn per formular angemeldet, nicht bei cookie; d.h. nur beim ersten mal  
    }  
    else  
    {  
    
    

    ?>

      
    <!--doctype, html, head, title, body und so-->  
    <form method="post" action="<?php echo $_SERVER['REQUEST_URI'] ?>">  
    Name: <input name="username" value="<?php echo $username ?>"><br>  
    Passwort: <input type="password" name="password"><br>  
    <input type="submit" value="Anmelden">  
    </form>  
    
    

    <?php

      
     exit()  
    }  
    
    

    ?>

    Kannst ja mal ausprobieren...

    Gruß, Marian