0

管理パネルにアクセスするためのログイン パネルをコーディングしています。データ (ユーザー名とパスワード) は MySQL データベース (タイプ: InnoDB) に保存されます。テーブルを見ると、パスワードはプレーンとして保存されており、フィールド パスワードには {plain}password があります。

私が既に持っているコードを適応させると、その {plain} が私を少し混乱させるので、いくつかの問題があります。

私の古いコードは次のとおりです。

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . md5($password) . "'"; 
$result = $mysqli->query($sql) or die(mysql_error());

したがって、データベースのフィールドの「{plain}password」を MD5 パスワードに置き換えると、コードはうまく機能しますが、コードを次のように変更すると:

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . $password . "'"; 
$result = $mysqli->query($sql) or die(mysql_error());

パスワードが違うのでログインできません!

これを修正する方法はありますか?

4

2 に答える 2

1

どういう意味かはわかりませんが{plain}、パスワードがプレーンテキストであり、この文字列が実際に存在していることを示していると思います。したがって、2番目のSQLには次のものを含める必要があります。

$sql = "SELECT * FROM table WHERE user = '" . mysql_real_escape_string($username) . "' AND password = '{plain}" . mysql_real_escape_string($password) . "'"; 

管理者パスワードをプレーンテキストで保存することについての議論を始めているのではなく、純粋に技術的な質問に答えていることに注意してください。ただし、プレーンテキストのパスワードを保存することは非常に悪い考えであると言わなければなりません。

mysql_real_escape_stringまた、入力をサニタイズするために追加したことにも注意してください。

于 2012-07-19T14:35:51.360 に答える
1

実際のパスワードの前にプレフィックス "{plain}" がある場合は、クエリを調整してそのプレフィックスを含める必要があります。

$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '{plain}" . $password . "'"; 
$result = $mysqli->query($sql) or die($mysqli->error());

また、関数も使用するようにコマンドを変更する必要があることに注意してください(したがって、を使用しmysql_error()die()ください)。mysqli$mysqli->error

PS: 最近のパスワードの保存方法を確認する必要があります。それらをプレーンテキストで保存することは、決して安全ではありません。

編集

ここでも @BrianRasmussen のコメントに言及します。クエリで直接 (文字列 concat を使用して) 使用する前に、サニタイズされていることを確認$usernameしてください。$passwordそうしないと、コードはあらゆる種類の SQL インジェクションに対してオープンになります。

于 2012-07-19T14:36:44.200 に答える