AnnaA: sicherer Login und Sessions in PHP

Hallo,

ich bin dabei ein kleines Projektmanagementsystem in PHP zu entwickeln.
Da dort auch sicherheitsrelevante Dokumente hinterlegt werden suche ich nach der idealen Methode um den Login zu realisieren.

Ich hatte mir eigentlich die Sessions ausgesucht... allerdings scheinen diese auch nicht so sicher zu sein, wie ich es mir vorstelle.

Meine Idee war:

  • Login per Sessions

  • IDs, PWs, sowie Benutzerrechte gecrypted abgelegt in mySQL DB

  • Jede einzelne PHP-Seite prüft, welche Rechte der zugreifende User hat, wenn er darf, dann wird die Seite angezeigt, ansonsten ein Fehler ausgegeben.

  • Die wichtigen Dokumente (xls etc.) werden außerhalb des Document Root platziert und sind dann nur noch per Script abrufbar. Dieses prüft wiederum intern, ob man das Recht dazu hat.

Macht meine Idee so Sinn, oder gibt es da Lücken die ich noch schließen sollte? (Kann man Sessions kopieren, oder darin übergebene Variablen vorspiegeln? Also eine andere BenutzerID zum Beispiel??)

Wäre das Ganze per .htaccess sicherer??

Danke für Eure Hilfe,
Anna

  1. Moin,

    Mit Session als Loginmöglichkeit liegst du, denke ich, garnicht so verkehrt :-)

    In meinem Board, in das sich registrierte USer einloggen können, habe ich folgende Funktionen verwendet:

    function dologin($username,$pass)
    {
    include('inc.php');
    $selectuser="SELECT * FROM board_user WHERE username LIKE '".$username."' AND pass LIKE '".$pass."' AND acces LIKE 'yes'";
    $doselectuser=mysql_query($selectuser,$dbconn);

    $row=mysql_fetch_array($doselectuser);

    if($row)
    {
    return true;
    }
    else
    {
    return false;
    }
    }

    (gibt true zurück, falls Benutzerdaten stimmen)

    session_register('login'); //Login-Session wird registriert
    session_register(username); //Username wird als Session registriert

    //folgende Funktion gibt Userdaten zurück

    function getuserinfo($username)
    {
    include('inc.php');
    $getuserinfo="SELECT * FROM board_user WHERE username LIKE '".$username."'";
    $dogetuserinfo=mysql_query($getuserinfo,$dbconn);

    if($userinfo=mysql_fetch_array($dogetuserinfo))
    {
    return $userinfo;
    }
    }

    $userinfo=getuserinfo($username);
    session_register(userinfo);

    So hättest du alle Userdaten in einer Variable, auf die du in allen Seiten zugreifen kannst
    (den USername hättest du sogar zweimal zur Verfügung ($username & $userinfo['username'])

    Ich hoffe ich konnte dir behilflich sein :-)

    ach ja: In der Logout-Seite brauchst du nur folgendes einzubinden:

    session_destroy();
    session_unregister('login');
    session_unregister($username);
    session_unregister($userinfo);

    Somit wäre der User perfekt ausgellogt

    LG Jakob

    --
    Wer andern eine Bratwurst brät, hat meist ein Bratwurstbratgerät!
  2. Hallo Anna,

    Macht meine Idee so Sinn,

    Ich würde sagen, ja.

    oder gibt es da Lücken die ich noch schließen sollte?

    Das Konzept sieht sicher aus. Was natürlich keine Garantie dafür ist, dass die fertigen Scripte sicher sein werden.

    (Kann man Sessions kopieren,

    Als Server-Admin: ja. Sonst: nein.

    Allerdings könnte man die Session-ID erraten, was aber unwarscheinlicher oder zumindest genauso unwarscheinlich sein dürfte, als dass jemand ein Passwort errät. Aber dass diese Möglichkeit besteht, sollte Dir klar sein.

    oder darin übergebene Variablen vorspiegeln? Also eine andere BenutzerID zum Beispiel??)

    Wenn Du per $_SESSION['variable'] prüfst, nicht.

    Wenn Du per $variable prüfst, besteht je nach Script eine Möglichkeit, die Du allerdings auch verhindern kannst. (Vor session_start alle kritischen Variablen durch unset() jagen, damit dies dann mit Sicherheit aus der Session kommen)

    Allerdings: Wenn Du Dir Sorgen um die Sicherheit machst, dann sollte register_globals (und somit die zweite Möglichkeit) _vor allem_ auf dem Produktionssystem deaktiviert sein: </archiv/2003/3/40235/#m220566>

    Wäre das Ganze per .htaccess sicherer??

    Nein. Im Gegenteil, sobald Du einen normalen oder gar einen automatisierten Logout brauchst, stellt Dich HTTP-Authentifizierung (zumindest Basic und Digest, andere kenne ich nicht und die Browser erst recht nicht) vor Probleme, die Du mit Sessions nicht hast. Dafür musst Du Dich bei Sessions um die Authentifizierung kümmern.

    Viele Grüße,
    Christian

    --
    | http://www.selflinux.org/                                                  |
    | http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm                      |
    | sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[ |
    | http://emmanuel.dammerer.at/selfcode.html                                  |