2

そのため、ログイン スクリプトに問題があります。私のデータベースにはソルト MD5 ハッシュが保存されていますが、まあ... このステートメントの後にこのコードを使用すると、パスワードが何であれログインします。

それが構文なのか、それとも私の使い方なのかはわかりませんが、パスワードが「lalala」でユーザーが「chicken」と入力しても、ユーザーが存在する場合はログインします。

$sql = ("select * from website where `Email`='$user' and `Password`='$pass'");
$query = mysql_query($sql);
if ($query) {
    $data = mysql_fetch_array($query, MYSQL_ASSOC);
    if (sizeof($data) > 0) {
        $_SESSION['vuser'] = $_POST['vuser'];
        header('Location: /');
        die;
    }
}

実行方法は次のとおりです。

index.php --> login を押します (POST データを送信します) --> login.php (このスクリプト) --> (ログインした場合は /index.php に戻り、そうでない場合は /login に移動します) .php。

私は、ソルト化された MD5 が「lolcats」としてハッシュされた「blah」という名前のテスト アカウントを持っています。ユーザー名の部分に「何とか」と入力し、パスワードを「stackoverflow」にすると、「index.php」に移動します 何かアイデアはありますか?

4

5 に答える 5

2

関数が返すprint_r($data)ものを確認してみてください。mysql_fetch_arrayFALSEを返す可能性があり、これはあなたの条件を超えますif (sizeof($data) > 0)

于 2013-10-04T20:32:08.817 に答える
1

あなたの論理は正しくありません。mysql_fetch_array()クエリ結果から 1 行のデータを表す配列を返すか、失敗した場合はブール値の FALSE を返します (クエリに行がないか、クエリ結果以外のものからフェッチしています)。

あなたがしているはずです:

$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
    ... user exists ...
} else {
    ... user does not exist ...
}
于 2013-10-04T20:31:36.900 に答える
1

これを使用しないでください:

if ($query) {
    $data = mysql_fetch_array($query, MYSQL_ASSOC);
    if (sizeof($data) > 0) {
        $_SESSION['vuser'] = $_POST['vuser'];
        header('Location: /');
        die;
    }
}

データのサイズを測定する理由は何ですか? それは検証するための貧弱な方法です。

代わりにこれを行います:

if ($query) {
    if(mysql_num_rows($query)>0){
        // In the above line, we check a user with that username and password exists
        $_SESSION['vuser'] == $_POST['vuser'];
        header('Location: /');
     } else echo "Bad password";
} else echo "Connection error";

補足として、mysql_* 関数の使用を今すぐ、または近いうちに停止してください。これらは PHP の次のバージョンで削除される予定であり、安全性が低くなります。PHP PDO クラスを使用できます。

また、$username と $pass をデータベースに直接保存していないと仮定しています。使用している場合は、今すぐ停止し、ハッシュ関数を使用してパスワードを保存してください。md5 および/または sha1 ハッシュ メソッドを使用できます。

于 2013-10-04T20:35:43.053 に答える
1

言われているように、以下で同様のmysqliを使用することもできます

$dbq=("SELECT * FROM users where username='$uname'");
$dbresult=mysqli_query($con,$dbq);

ここで、$con は、mysqli で作成する接続クエリです。

これで、以下と同様のデータを取得できます。

$obj=$dbresult->fetch_object();
$dbmail=$obj->Email;
$dbuname=$obj->Password;
于 2013-10-04T20:39:07.640 に答える
0
    $sql = ("select * from website where `Email`='$user' and `Password`='$pass'");
    $query = mysql_query($sql);
    $row = mysql_fetch_array($query, MYSQL_ASSOC);
    if ($row) {

            $_SESSION['vuser'] = $_POST['vuser'];
            header('Location:"go where ever you want to i dont care"');

        }
   else{ //some error message}
于 2013-10-04T20:41:48.197 に答える