Das Login Script würde ich so machen:
PHP:
session_start();
if (isset($_POST['username'], $_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$connect = mysql_connect("localhost", 'xxx', 'xxx') or die("Couldn't connect!");
mysql_select_db('xxx', $connect) or die("Couldn't find DB");
$sql = "select * from xxx where username = '".mysql_real_escape_string($username)."' and password = '".md5($password)."'";
$result = mysql_query($sql, $connect);
if ($row = mysql_fetch_assoc($result)) {
echo 'You are logged in! <a href="member.php">Click</a> here to enter the member page.';
$_SESSION['username'] = $username;
} else {
echo 'Incorrect username or password!';
}
mysql_free_result($result);
} else {
echo 'Please submit the form.';
}
Du überprüfst nämlich nicht, ob die Formularelemente existieren, du machst das auf gut Glück.
Außerdem, halte ich es für sicherer, wenn man dem Benutzer nicht sagt, ob das Passwort oder der Benutzername falsch ist. Dieselbe Fehlermeldung für beide Fälle gibt dem Angreifer nicht einmal den Hinweis, ob er auf der richtigen Spur ist.
Du hast im Übrigen den Tipp, den man dir gegeben hat nicht befolgt: mysql_real_escape_string benutzen!
Den Rest habe ich ein wenig geändert, war aber in deiner Form ok.
member.php ist ok.
register.php
PHP:
<?php
echo '<h1>Register</h1>';
if (isset($_POST['submit'], $_POST['nickname'], $_POST['password'], $_POST['repeatpassword'])) {
$nickname = $_POST['nickname'];
$password = $_POST['password'];
$repeated = $_POST['repeatpassword'];
$date = date('Y-m-d');
$errors = array();
if (strlen($nickname) > 25) {
$errors[] = 'The username is too long.';
}
if (strlen($nickname) === 0) {
$errors[] = 'The username is too short.';
}
if ($password !== $repeated) {
$errors[] = 'The passwords do not match.';
}
if (strlen($password) < 6) {
$errors[] = 'The password is too short.';
}
if (count($errors) === 0) {
$connect = mysql_connect('xxx', 'xxx', 'xxx');
mysql_select_db('xxxx', $connect);
mysql_query("insert into xxx values ('', '".mysql_real_escape_string($nickname)."', '".md5($password)."')");
echo 'Your account has been created.';
} else {
echo '<p>Errors: '.implode('<br />', $errors).'</p>';
}
} else {
$nickname = '';
}
?>
Wieder einmal überprüfst du nicht gut genug, ob das Formular auch wirklich abgeschickt wurde.
Du überprüfst nicht, ob der Benutzername ok ist und du kürzt den Benutzernamen, ohne den Benutzer darüber zu informieren, mit strip_tags. Lass HTML-Tags einfach stehen und escape sie jedes Mal, wenn du ihn anzeigst mit htmlspecialchars.
Da das Passwort mit MD5 verschlüsselt wird, brauchst du dort erst recht nichts zu modifizieren. Und ein oberes Limit für die Passwortlänge halte ich in Verbindung mit md5 sowieso sinnlos (außer vielleicht das Limit auf 255 o. Ä. setzen).
Du überprüfst falsch, ob die Passwörter identisch sind:
apfel ist nicht gleich Apfel, das siehst du an den erzeugten md5s erst recht. Benutze den ===-Operator statt den ==-Operator.
Mal wieder, benutzt du nicht mysql_real_escape_string. Und wozu speicherst du die Passwortwiederholung?