私が十字架に執着する前に、私はこれを1週間続けてきました。私はこのプラットフォーム上のpassword_hash
とpassword_verify
に関するすべての記事も読んだことがありますが、文字列の長さとデータベースの長さなどからは解決策がありませんでしたので、質問を投稿することにしました。Password_Hash、Mysql、SetFetchMode、Password_verify
私はログインスクリプトを書いており、私はpassword_verify
を使用しました。私はちょうどPHPでセキュリティを学び、自分のコードを改善したいと思っていました。
ログインしようとするたびにログインしません。
public function create() {
// Don't forget your SQL syntax and good habits:
// - INSERT INTO table (key, key) VALUES ('value', 'value')
// - single-quotes around all values
// - escape all values to prevent SQL injection
/* $sql = "INSERT INTO users (username, password, first_name, last_name)
VALUES(?, ?, ?, ?)";*/
$sql = "INSERT INTO users (username, password, email, date_created)
VALUES(:username, :password, :email, :date_created)";
try {
// prepare sql and bind parameters
$core = ConnectionManager::getInstance();
$stmt = $core->con->prepare($sql);
/*$stmt = $db->prepare("INSERT INTO users (id, username, password, first_name, last_name)
VALUES (:id, :username, :password, :first_name, :last_name");*/
//$stmt->bindParam(':id', 1);
$username = $this->username;
$password = password_hash($this->password, PASSWORD_BCRYPT);
$email = $this->email;
$date_created = strftime("%Y-%m-%d %H:%M:%S", time());
/*$username = "boiy";
$password = password_hash("redrum", PASSWORD_BCRYPT);
$email = "[email protected]";
$date_created = strftime("%Y-%m-%d %H:%M:%S", time());*/
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':date_created', $date_created, PDO::PARAM_STR);
if($stmt->execute()) {
$this->id = $core->con->lastInsertId();
echo "New records created successfully";
return true;
} else {
return false;
}
} catch (PDOException $e) {
echo "Insert Error: " . $e->getMessage();
}
}
これは新しいユーザーを作成するためです。出来た。
は、その後、私は、ユーザーがログインしようとした:
if($session->is_logged_in()) {redirect_to("admin.php");}
// Remember to give your form's submit tag a name="submit" attribute!
if (isset($_POST['submit'])) { // Form has been submitted.
$username = trim($_POST['username']);
$password = trim($_POST['password']);
$YRJWA = "YRJWA";
$string = "$2y$10$$YRJWA/EJQGkmqev6VlpteOXHwF6DeQWcU1x1uGqmOdY4CDK5.oJYi";
// Check database to see if username/password exist.
$found_user = User::authenticate($username, $string);
if ($found_user) {
//if (password_verify($password, $found_user->password)) {
$session->login($found_user);
log_action('Login', "{$found_user->username} logged in.");
redirect_to("admin.php");
//}
} else {
// username/password combo was not found in the database
$message = "Username/password combination incorrect.";
}
} else { // Form has not been submitted.
$username = "";
$password = "";
}
私はこれを行うと、それは動作しません。 password_verify
を入力すると機能しませんので、上のコードのようにコメントアウトしました。
私は、そこに新しいページを作成し、自分のコードをテストした:
$YRJWA = "YRJWA";
$string = "$2y$10$$YRJWA/EJQGkmqev6VlpteOXHwF6DeQWcU1x1uGqmOdY4CDK5.oJYi";
//$string = 'redrum';
echo "<hr>";
$found_user = User::authenticate('boiy', $string);
print_r($found_user);
echo "<br>";
/*echo strlen($found_user->password);*/
/*echo utf8_encode($found_user->password);
echo utf8_decode($found_user->password);*/
echo "<br/>";
//echo substr($found_user->password, 0, 60);
var_dump($found_user->password);
echo "<br>";
if(password_verify('redrum', $found_user->password)) {
echo "Valid";
} else {
echo "Invalid";
}
ConnectionManager::close();
を、私は、データベースから直接パスワードを使用する場合、それは「有効」、右データやプリントを返します。私は、コメントを削除し、しようとすると
は「redumは、」それは、このエラーに
お知らせを与える:\ xamppの\ htdocsに\ WealthPlusプライベート\ \ index.phpを上:C内の非オブジェクトのプロパティを取得しようライン36 NULL
お知らせ:Cで非オブジェクトのプロパティを取得しようとすると:\ xamppの\ htdocsに\ WealthPlus行のプライベートの\ index.phpを\ 39 無効
public static function authenticate($username="", $password="") {
$sql = "SELECT username, password FROM users WHERE username = :username AND password = :password LIMIT 1";
try {
$core = ConnectionManager::getInstance();
$stmt = $core->con->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$stmt->execute([':username' => $username, ':password' => $password]);
$stmt->setFetchMode(PDO::FETCH_CLASS, "User");
$users = $stmt->fetch();
//if (password_verify($password, $users->password)) {
return $users;
//}
//return !empty($users) ? array_shift($users) : false;
}catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
}
私は必要な場合に画像を投稿します。私は1週間これを行っていて、何が開発中であるかを調べています... PLS HELP – Boiy
データベースから文字列を直接使用すると...動作します。私のパスワード「redrum」に戻し、password_verify関数を使用してください..うまくいきません – Boiy
あなたはフレームワークを正しく使用していますか?あなたはどちらを使っていますか? – RiggsFolly