私はここで初心者の髪を引き裂いています。以下のコードが機能しない理由がわかりません。ページは問題なく読み込まれますが、データベースにあるユーザー名とパスワードでログインしようとすると、実際にはログアウト ボタンを表示したいのに、ページがログイン フォームで元の状態にリロードされます。また、ソルトとハッシュのないパスワードと、データベース内のハッシュ化されていない、ソルト化されていない同等のパスワードを比較してみました。動作していません。
「システムのタイムゾーン設定に依存するのは安全ではありません」という警告のみが表示されます。、そしてそれらはパスワード検証機能とは何の関係もないと思います。
ページは次のように始まります。
session_start();
error_reporting(-1); ini_set('display_errors', 'On');
次に、いくつかの HTML に従います。それで:
if (isset($_POST['log_out'])) {
session_unset();
session_destroy();
$_SESSION = array();
}
ログアウト ボタンを押すと、 が設定されます$_POST['log_out']
。次に、SQL インジェクションを防ぐために使用される本から得た関数があります。
function mysql_fix_string($string) {
if (get_magic_quotes_gpc()) $string = stripslashes($string);
$string = htmlspecialchars($string, ENT_QUOTES);
$string = mysql_real_escape_string($string);
return $string;
}
次に、ユーザーがログインフォームを送信した場合にのみ実行されるパスワード検証部分があります (同じページに投稿されるため、 と が設定さ$_POST['username']
れます$_POST['password']
)。
if (isset($_POST['username']) && isset($_POST['password'])) {
$salt1 = 'how';
$salt2 = 'pony';
$password = md5($salt1 . $_POST['password'] . $salt2);
$db_hostname = 'xxxxxxxxx';
$db_username = 'xxxxxxxxx';
$db_password = 'xxxxxxxxx';
$db_database = 'xxxxxxxxx';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error());
mysql_select_db($db_database)
or die("Unable to select database: " . mysql_error());
$username = mysql_fix_string($_POST['username']);
$query = "SELECT password FROM users WHERE name = '" . $username . "'";
$result = mysql_fetch_assoc($query);
$passwordindatabase = $result['password'];
if ($password == $passwordindatabase) {
$_SESSION['logged_in'] = true;
$_SESSION['user'] = $username;
unset($_POST['username']);
unset($_POST['password']);
}
}
もう少し下にあるのは、ログイン フォームif ($_SESSION['logged_in'] != true)
です。入力フィールドの値を (同じページに) 投稿username
しpassword
ます$_SERVER['REQUEST_URI']
。