Hallo,
ich programmiere jetzt seit ca 1 Jahr mit php/mysql und habe jetzt versucht ein Loginscript zu schreiben, was einigermaßen sicher ist.
Jetzt wollte ich wissen was ihr darüber denkt , sicher?, kann man die Performance noch irgendwie verbessern ?
kurz ein paar Daten zur Phpkonfiguration:
magic_quotes_gpc Off
session.cache_expire 60
session.cookie_httponly On
session.cookie_lifetime 0
session.gc_maxlifetime 7200
session.use_cookies On
session.use_only_cookies On
hier das Formular zum Einloggen start.php:
das Loginscript login.php:
und zum Schluss die geschützte Seite sicher.php:
wo ich mir jetzt noch unsicher bin ist ob ich die session_id bei jedem aufrufen oder nach zb 5 min erneuern soll ( wegen der Performance ) und ob ich bei Falschem Benutzernamen dem User sagen soll dass er falsch war oder einfach nur einen allgemeinen Fehler ausgeben soll. ( Wenn ein Angreifer weis dass der Name existiert, kann er versuchen das PW herauszufinden ).
Kazuma
ich programmiere jetzt seit ca 1 Jahr mit php/mysql und habe jetzt versucht ein Loginscript zu schreiben, was einigermaßen sicher ist.
Jetzt wollte ich wissen was ihr darüber denkt , sicher?, kann man die Performance noch irgendwie verbessern ?
kurz ein paar Daten zur Phpkonfiguration:
magic_quotes_gpc Off
session.cache_expire 60
session.cookie_httponly On
session.cookie_lifetime 0
session.gc_maxlifetime 7200
session.use_cookies On
session.use_only_cookies On
hier das Formular zum Einloggen start.php:
PHP:
<?php
if($_GET[nichteingeloggt] == 'true')
{
echo '
Du must dich zuerst einloggen ******
';
}
if($_GET[logout] == 'true')
{
echo '
Sie haben sich erfolgreich ausgeloggt ******
';
}
echo '
<h2>Anmelden</h2>
<form method="POST" action="login.php">
<table cellspacing="1" cellpadding="2" border="0">
<tr>
';
if($_GET[benutzernameerror] == 'true')
{
echo '
<td><font size="2" color="red">Benutzername:</font></td>
<td><font size="2"><input type="text" name="user" value=""> Unbekannter Benutzername</font></td>
';
}
else {
echo '
<td><font size="2">Benutzername:</font></td>
<td><font size="2"><input type="text" name="user" value=""></font></td>
';
}
echo '
</tr>
<tr>
';
if($_GET[passworderror] == 'true')
{
echo '
<td><font size="2" color="red">Passwort:</font></td>
<td><font size="2"><input type="password" name="password" value=""> Falsches Password</font></td>
';
}
else {
echo '
<td><font size="2">Passwort:</font></td>
<td><font size="2"><input type="password" name="password" value=""></font></td>
';
}
echo '
</tr>
<tr>
<td colspan=2 align=center><input type=submit value=Anmelden></td>
</tr>
</table>
</form>
';
?>
das Loginscript login.php:
PHP:
<?php
include'connect.php';
if($_POST['user'] == '')
{
header("location:start.php?namefehlt=true");
exit();
}
if($_POST['password'] == '')
{
header("location:start.php?passwordfehlt=true");
exit();
}
$user = trim( $_POST['user'] );
$password = trim( $_POST['password'] );
$user = mysqli_real_escape_string($con, $user);
$sql = "SELECT `user` FROM `userdaten` WHERE `user` = '$user' AND `aktiviert` = 1";
$abfrage = mysqli_query($con, $sql);
if (mysqli_num_rows($abfrage) <= 0)
{
mysqli_close($con);
header("location:start.php?benutzernameerror=true");
}
else
{
$sql = "SELECT * FROM `userdaten` WHERE `user` = '$user' AND `aktiviert` = 1";
$abfrage = mysqli_query($con, $sql);
$row = mysqli_fetch_row($abfrage);
if ($row[6] == 1)
{
header("location:start.php?acoountgesperrt=true");
mysqli_close($con);
exit();
}
if ($row[5] == 1)
{
header("location:start.php?logingesperrt=true");
mysqli_close($con);
exit();
}
if ($row[2]==sha1($password.$user))
{
session_start();
session_unset();
$_SESSION = array();
session_regenerate_id(true);
$_SESSION['user'] = $user;
$_SESSION['user_id'] = $row[0];
$_SESSION['user_info'] = strip_tags($_SERVER['HTTP_USER_AGENT']);
$_SESSION['letzter_login'] = $row[7];
$_SESSION['angemeldet'] = true;
$sql = "UPDATE `userdaten` SET `fehlversuche` = 0, `letzter_login` = NOW() WHERE `user` = '$user' LIMIT 1";
mysqli_query( $con, $sql );
mysqli_close($con);
header("location:sicher.php");
}
else
{
if ($row[3] == 4)
{
$sql = "UPDATE `userdaten` SET `login_sperre` = 1, `fehlversuche` = 0 WHERE `user` = '$user' LIMIT 1";
mysqli_query( $con, $sql );
mysqli_close($con);
header("location:start.php?logingesperrt=true");
}
else
{
$sql = "UPDATE `userdaten` SET `fehlversuche` = `fehlversuche` + 1 WHERE `user` = '$user' LIMIT 1";
mysqli_query( $con, $sql );
mysqli_close($con);
header("location:start.php?passworderror=true");
}
}
}
?>
und zum Schluss die geschützte Seite sicher.php:
PHP:
<?php
session_start();
if(isset($_SESSION['angemeldet']) && $_SESSION['angemeldet'] == 'true')
{
if($_SESSION['user_info'] != strip_tags($_SERVER['HTTP_USER_AGENT']))
{
session_unset();
$_SESSION = array();
session_destroy();
header("location:start.php");
exit();
}
session_regenerate_id(true);
/* hier kommt der geschützte inhalt hin*/
else {
header("location:start.php?nichteingeloggt=true");
}
?>
wo ich mir jetzt noch unsicher bin ist ob ich die session_id bei jedem aufrufen oder nach zb 5 min erneuern soll ( wegen der Performance ) und ob ich bei Falschem Benutzernamen dem User sagen soll dass er falsch war oder einfach nur einen allgemeinen Fehler ausgeben soll. ( Wenn ein Angreifer weis dass der Name existiert, kann er versuchen das PW herauszufinden ).
Kazuma