1

私はここで初心者の髪を引き裂いています。以下のコードが機能しない理由がわかりません。ページは問題なく読み込まれますが、データベースにあるユーザー名とパスワードでログインしようとすると、実際にはログアウト ボタンを表示したいのに、ページがログイン フォームで元の状態にリロードされます。また、ソルトとハッシュのないパスワードと、データベース内のハッシュ化されていない、ソルト化されていない同等のパスワードを比較してみました。動作していません。

「システムのタイムゾーン設定に依存するのは安全ではありません」という警告のみが表示されます。、そしてそれらはパスワード検証機能とは何の関係もないと思います。

ページは次のように始まります。

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)です。入力フィールドの値を (同じページに) 投稿usernamepasswordます$_SERVER['REQUEST_URI']

4

3 に答える 3

4

mysql_query()関数が欠落しているように見えます。つまり、実際にクエリを実行していないことを意味します。

mysql_query — MySQL クエリを送信する

以下を実行して、動作するかどうかを確認します。

$result = mysql_query($query);

$passwordindatabase = mysql_fetch_assoc($result);

編集
まったく別の注意として、mysql 関数は非常に古く、mysql_injection の脆弱性があるため、使用しないでください。できるだけ早く PDO を使い始めることをお勧めします。PDO は (正しく行われていれば) mysql_injection の脆弱性を持っていません。

于 2012-05-15T13:05:52.040 に答える
0

Cookieベースのセッションを使用するsession_start()には、ブラウザに何かを出力する前にを呼び出す必要があります。

ただし、タイムゾーン警告は前に送信されます。

ファイルにタイムゾーンを設定しphp.iniます。

編集..この問題だけではありません。mysql_query()の前にSQLリクエストで関数を使用する必要がありますmysql_fetch_assoc()

于 2012-05-15T12:48:29.467 に答える
0

あなたが示しているコードについて「においがする」唯一のビットはこれです:

if ($password == $passwordindatabase) {

私はこのようなものを見たいと思います:

if (strcmp($password, $passwordindatabase) == 0) {

また、明らかにとが一致していないusersため、実際にテーブルに値を挿入しているコードを確認する必要があります。$password$passwordindatabase

于 2012-05-15T12:55:14.777 に答える