私はPHP
とMySQL
の初心者です。私はMySQL 5.7 DBでユーザ入力(ユーザ名とパスワード)を検証しようとしていますが、チャンスはありません。私の問題を説明しましょう。PHPを使用してMysql 5.7のユーザーの資格情報を確認
firstdb
にユーザ名:firstuser
パスワード:firstpassword
からphpMyAdmin
ページを作成しました。
CODE(check_user-pass.php)
<?php
ob_start();
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="rootpassword"; // Mysql password
$db_name="firstdb"; // Database name
$tbl_name="mysql.user"; // Table name
$conn = new mysqli($host, $username, $password, $db_name);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
// Define $username and $password
$myusername=$_POST['EMail'];
$mypassword=$_POST['Password'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = mysqli_real_escape_string($conn,$_POST['EMail']);
$mypassword = mysqli_real_escape_string($conn,$_POST['Password']);
$sql="SELECT * FROM $tbl_name WHERE user='$myusername' and authentication_string='$mypassword'";
$result = $conn->query($sql);
$count = 0;
// Mysql_num_row is counting table row
if ($result = mysqli_query($conn, $sql)) {
/* determine number of rows result set */
$count = mysqli_num_rows($result);
printf("Result set has %d rows.\n", $count);
/* close result set */
mysqli_free_result($result);
}
// If result matched $username and $password, table row must be 1 row
if ($count==1) {
echo "Success! $count";
} else {
echo "Unsuccessful! $count";
}
ob_end_flush();
?>
コードリターン:and authentication_string='$mypassword'
コードリターン:Connected successfullyResult set has 0 rows. Unsuccessful! 0
私はこの行を削除する場合Connected successfullyResult set has 1 rows. Success! 1
私は正常にindex.php
からユーザー入力を取得するo check_user-pass.php
しかし、mysql.user
テーブルには、データベースの照合のための明確なパスワード列はありません。
ネットで検索して検索します。 password
列が5.xではauthentication_string
に変更されましたが、この列はハッシュされたものを保持します。だから私はこれとユーザーのパスワードを一致させることはできません。
質問1
iは、テーブルを作成し、検証するためのDB内のすべてのユーザーのユーザー名とクリアパスワードを保存すべきか? question1答えがNOであれば
質問2
、どのようにこの検証の問題を達成することができますか?
_store [...] clear password_ - NO!どのような状況においても決して決してクリアなパスワードを保存することは決してありません。 – Marvin
でも同じと思います。 –
パスワードをエスケープすることはお勧めできません。特に '123 '\ abc'のようなものは完全に有効です。これらをエスケープすると、 'password_hash()'を使ってハッシュされたパスワードを保存する場合、 'password_verify()'に失敗して '123 \ '\ abc'として書き換えられます。どちらの場合にも;それでも失敗する。 –