我創建了一個系統,允許管理員使用電子郵件地址和密碼註冊另一個管理員以登錄到受保護區域。一個管理員通過這種形式註冊:爲什麼我的登錄系統無法正常工作?
<form action="adduser.php" method="POST">
<label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" />
<label for="password">Password: </label><input type="password" name="password" />
<label for="name">Name: </label><input type="text" name="name"/>
<input type="submit" value="Submit" name="submit"/>
</form>
的adduser.php看起來是這樣的:
<?php
require'databaselogin.php';
if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){
$result= $pdo->prepare('INSERT INTO users (emailaddress, password, name)
VALUES(:emailaddress, :password, :name)');
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
unset($_POST['submit']);
$_POST['password'] = $hash;
$result->execute($_POST);
header("Location:admin.php");
}
?>
到這裏似乎工作表叫用戶,那麼被填充數據。我猜可能它可能使用$ hash不正確,比在表中存儲的密碼不是用戶在密碼字段中輸入的內容?
當用戶嘗試登錄使用這種形式:
<form action="login.php" method="POST" >
<label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/>
<label for="password">Password:</label><input type="password" name="password"/>
<input type="submit" value="Go" name="submit"/>
</form>
鏈接到這個PHP:
<?php
session_start();
require'databaselogin.php';
$stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress');
if(isset($_POST['submit'])){
$criteria = [
'emailaddress' => $_POST['emailaddress'],
];
$stmt->execute($criteria);
$user = $stmt->fetch();
var_dump($user);
if (password_verify($_POST['password'], $user['password'])) {
$_SESSION['loggedin'] = $user['id'];
header("Location:admin.php");
}
else {
header("Location:index.php");
}
}
?>
正確的電子郵件和密碼輸入到從網站上註冊剛剛重裝上index.php,而不是把它們帶到admin.php。我真的無法理解這個問題,因爲代碼看起來聽起來太我我猜這是一個問題,無論$ hash實際上保存到密碼字段。
如果有人可以幫助這個,它會非常感激!
這個怎麼樣,註冊1234的簡單密碼的用戶,並檢查你的表存儲的哈希值。然後使用相同的方法回顯散列1234,查看字符串是否匹配。如果他們這樣做,這個問題與散列無關。 – Abdel
和,密碼欄的長度是多少?如果它太短,那麼*無聲無息*。 –
'var_dump($ user)'的結果是什麼? –