Optimierung des Loginscripts

Hey, ich habe eigentlich kein Problem, nur wollte ich mal von euch wissen, ob das, was ich da programmiert habe, auch sicher ist.

Noch eine kleine Information vorab: Das Script soll zur Administration gedacht sein, d.h. für ein kleines CMS für meine Kunden, also keine öffentliche Anmeldung für hunderte von Usern…

login.php
[PHP]<?php
session_start();

include(‚mysql.php‘);

if($_SERVER[‚REQUEST_METHOD‘] == ‚POST‘){

$user = $_POST[‚user‘];
$user = mysql_real_escape_string($user);
$password = mysql_real_escape_string($_POST[‚password‘]);
$password = md5($password);

$query = mysql_query(„SELECT * FROM user WHERE login=‚$user‘ AND password=‚$password‘“) or die (mysql_error());
$result = mysql_fetch_assoc($query);

if($result == TRUE){

$datei = $_SERVER["DOCUMENT_ROOT"] . '/guestbook/users/' . strtolower($result['login']) . '.txt';
$inhalt = $result['ID'] . "-" . $result['login'] . "-" . $_SERVER['REMOTE_ADDR'] . "-" . date('d-m-Y-H-i');
$fp = fopen($datei, 'w');
    
if(fwrite($fp, $inhalt) !== FALSE){

  $_SESSION['ID'] = $result['ID'];
  $_SESSION['LOGIN'] = $result['login'];
  $_SESSION['NAME'] = $result['name'];
  $_SESSION['EMAIL'] = $result['email'];
  echo '<p>Sie wurden erfolgreich eingeloggt, ' . $_SESSION['NAME'] . '.</p>';
  echo '<meta http-equiv="refresh" content="2; url=index.php">';
  
} else {

  echo '<p>Fehler</p>';

}

} else {

echo '<p>Benutzername und Passwort in dieser Kombination nicht gefunden.</p>';

}

}

mysql_close();

?>[/PHP]logged.inc.php
[PHP]<?php
session_start();

if(isset($_SESSION[‚ID‘])){
$datei = $_SERVER[„DOCUMENT_ROOT“] . ‚/guestbook/users/‘ . strtolower($_SESSION[‚LOGIN‘]) . ‚.txt‘;
$content = file_get_contents($datei);
$arr = explode(‚-‘, $content);

$logindate = mktime($arr[6], $arr[7], 0, $arr[4], $arr[3], $arr[5]);
$currentdate = time();
$difference = $currentdate-$logindate;

if($arr[0] != $_SESSION[‚ID‘] || $arr[1] != $_SESSION[‚LOGIN‘] || $arr[2] != $_SERVER[‚REMOTE_ADDR‘]){
session_destroy();
unlink($datei);
echo ‚‘;
} elseif($difference > 43200){
session_destroy();
unlink($datei);
echo ‚‘;
} else {
$_SESSION[‚LOGGED‘] = TRUE;
}
} else {
session_destroy();
unlink($datei);
}

?>[/PHP]Erläuterung des Codes:

  • mysql.php enthält die Daten der Datenbank (Host, User, Passwort, Datenbank, Verbindung zur Datenbank)
  • Daten des Loginformulars werden an die login.php gesendet. Nach dem erfolgreichen Datenbankabgleich wird die Session gesetzt und eine Datei für den User geschrieben. (Name: username.txt, Format: ID-USERNAME-IP-TAG-MONAT-JAHR-STUNDE-SEKUNDE)
  • Die logged.inc.php wird auf allen geschützten Seiten includiert. Sie prüft, ob die Session gesetzt ist, liest die Datei aus, gleicht ID und USERNAME der Session und der Datei ab und prüft, wie lange der User schon eingeloggt ist. Stimmt die ID, der USERNAME oder die IP nicht, oder ist der User schon zu lange eingeloggt, bekommt der User eine entsprechende Fehlermeldung, die Session und die Datei werden gelöscht (falls vorhanden), ansonsten wird $_SESSION[‚LOGGED‘] (für spätere Aktionen) gesetzt und der Content wird freigegeben. Diese Prüfung wird bei jedem Seitenaufruf neu ausgeführt.
  • $_SESSION[‚LOGGED‘] kann man zum Beispiel auch mit verschiedenen Werten bestücken, um eine Rechtehierarchie zu verwenden (Benutzer darf Content verändern, Admin muss Änderung freischalten).

Ist dieses Script so sicher? Gibt es Methoden, wie jemand dieses Script knacken kann und sich unberechtigt Zugang verschaffen kann? Was kann ich besser machen? Ich will nicht, dass meine Kunden geschädigt werden.

Das Script ist natürlich OpenSource, ihr könnt es nach Belieben verwenden und verbreiten, wenns euch Spaß macht ;D

Timmäh