Ниже приведены мои учетные данные.
id username password salt status
1 test qepoihadfnkdsgbkajb1358139jbdf 35asf24s 1
Ниже мой SQL-запрос, что я хотел бы выполнить.
$sql = "SELECT * FROM user WHERE username = :username AND password = 'SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(':password')))))' AND status = :status";
Ниже приведен мой фрагмент кода для извлечения записи пользователя.
$this->_user = User::findBySql($sql, [
':username' => $this->username,
':password' => $this->password,
':status' => 1,
])->one();
Приведенный выше код возвращает ноль. Кажется, что он не может зашифровать введенный пароль для сравнения с хэшем пароля. Таким образом, я попробовал следующий код.
$this->_user = User::find()->where("username = :username AND (password = 'SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(':password')))))' OR password = '" . md5(":password") . "') AND status = :status")
->addParams([
':username' => $this->username,
':password' => $this->password,
':status' => 1,
])->one();
Это также возвращает ноль в качестве результата. Как я могу зашифровать введенный пароль, используя специальную соль, чтобы сравнить с хэшем пароля и вернуть запись? Даже я работаю с Yii 2, но я не хочу использовать Yii для входа в систему из-за некоторых технических требований.
Не использовать findBySql
если у вас нет конкретной причины. Вы теряете абстракции.
'" . md5(":password") . "'
тоже плохо и неправильно: вы хэшировали не sql запрос, а строку :password
,
Посмотрите этот код:
$query = User::find()->where('password_hash = SHA1(:password)', [
':password' => 'password'
]);
$sql = $query->createCommand()->getRawSql();
$user = $query->one();
использование getRawSql
для отладки вашего запроса. Вы всегда можете увидеть, что отправлено на сервер SQL.
Это неправильный способ проверить пароль. Невозможно проверить пароль внутри оператора SQL из-за соли, которую мы надеемся применить. Также небезопасно использовать SHA-1 для хранения паролей, потому что этот алгоритм слишком быстр и может быть легко взломан.
Вместо этого вы можете сделать запрос только с именем пользователя. Если строка может быть найдена, вы можете прочитать и проверить хэш пароля:
$sql = "SELECT * FROM user WHERE username = :username AND status = :status";
Инфраструктура Yii предлагает вспомогательные функции для генерации и проверки хэшей паролей. это документация может начать вас Альтернативой является вызов функций PHP password_hash () а также password_verify () непосредственно.