0

私は掲示板に取り組んでいて、ちょうどそれを始めたばかりで、現在ログイン機能に取り組んでいます。しかし、問題があります。データをフェッチしようとすると、何も返されないか、「1」が返されます。mySQL を PHP に統合するのは初めてなので、何が起こっているのかわかりません。私が間違っていることを理解するのを手伝ってくれれば、それは素晴らしいことです。

    $query = mysql_query("
    SELECT * FROM users WHERE username='$username'
");

while ($row = mysql_fetch_assoc($query)){
    $dbID = $row['id'];
    $dbUser = $row['username'];
    $dbPass = $row['password'];
}

if ($dbUser = $username && $dbPass = $password) {
    //if user and pass match do stuff
    $_SESSION['username'] = $dbUser;
    $_SESSION['id'] = $dbID;
    $_SESSION['ip'] = $_SERVER['HTTP_USER_AGENT'];
    header("Location: messageboard.php");
}
else {
    //if user and pass dont match do stuff
    $_SESSION['loginError'] = "Your username and password do not match";
    header("Location: login.php");
}

そのすべてのコードが返されます - ID: ユーザー名: 1 IP: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/28.0.1500.95 Safari/537.36

4

1 に答える 1

0

まず、andrewsi が述べたように、値を比較するために$dbUser = $username && $dbPass = $password使用する必要があります。==

2番目:このようにすることは非常に脆弱です。

まず、パスワードを「プレーンテキスト」で保存したように見えるので、直接比較を使用できます。そうしないでください。(塩漬けまたは胡椒)ハッシュを保存し、ユーザー入力をそのハッシュと比較します!

2 番目: WHILE-Loop ( while ($row = mysql_fetch_assoc($query)){) を使用してユーザー データを設定しています。1 つのユーザー名には正確に 1 つのデータ セットが含まれている必要があるため、これは必須ではありません。

3番目:$usernameクエリで使用します。あなたの例には の生成が含まれていませんが、$usernameソースコードで見たものから、 のように見える可能性が最も高いです$username = $_POST["username"]

したがって、この時点で、入力されたユーザー名を変更して、有効なログインを受信できるようにすることができます。(SQL インジェクション)。

ユーザー入力をエスケープします ( MySQL_real_escape_string()SQL クエリに渡す前に使用します。

于 2013-08-16T17:47:07.097 に答える