我怎样才能把这个变成一个安全登录?
这个问题在这里已经有了答案:
正如您已经注意到的那样,您需要安全地存储密码。 如果你不这样做,你可能会像Adobe Systems最近一样感到尴尬。
有两个步骤:
首先,当用户创建或更新密码时,对其进行编码并存储编码值。
其次,当用户尝试登录时,对密码进行编码并将其与存储的编码值进行比较。 只有在编码值匹配的情况下,您才允许用户访问。
一个很好的方法是使用一个难以反向的哈希算法和一个随机盐。 在这里看到一些关于这样做的优秀信息:
在PHP中编码密码的最佳方法
对你提出这个问题很有帮助。 安全编程很难做到正确。 许多人试图重新发明车轮,并成功地重新开发了爆胎。
session_start();
ob_start();
// db connect
$dbh = new PDO("mysql:host=localhost;dbname={$db_name}", $dbusername, $password);
$stmt = $dbh->prepare("SELECT password FROM {$tbl_name} WHERE username = :username");
$stmt->bindParam(':username', $_POST['username']);
$stmt->execute();
$password = $stmt->fetchColumn();
if($password !== false && password_verify($_POST['password'], $password)){
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
header('location:login_success.php');
}else {
include("top.php");
include("style.css");
echo '<p align=center><font size=2>Login Failed. <a href="http://www.sentuamessage.com/login.php">Please Try Again</a></p>';
include("bottom.php");
}
ob_end_flush();
为了将密码哈希保存到数据库,使用它来生成密码哈希
// Assuming that password you want to store is in $_POST['password']
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
如果你的PHP版本大于5.5,那么你可以去看看@Mark Baker关于userland实现的评论。 如果你的版本低于5.3.7,那么也许你应该想一些其他的密码散列方法。
还要将数据库上的所有密码转换为散列密码。 密码必须正确才能正常工作 。 否则,你将不得不使用类似password_verify(md5($_POST['password']), $password)
来验证密码。
您还应该将数据库VARCHAR(255)中的密码字段设置为将来安全。
$dbHost = 'localhost';
$dbUser = 'Database username here';
$dbPass = 'Database password here';
$dbBase = 'Database name here';
$usersTable = 'users';
$userIdColumn = 'username';
$userPasswordColumn = 'password';
if (function_exists('password_hash') && function_exists('password_verify')){
$dbh = new PDO("mysql:host={$dbHost};dbname={$dbBase}", $dbUser, $dbPass);
$users = $dbh->prepare("SELECT {$userIdColumn} as id, {$userPasswordColumn} as password FROM {$usersTable}");
$users->execute();
$userUpdate = $dbh->prepare("UPDATE `{$usersTable}` SET `{$userPasswordColumn}` = :password WHERE `{$userIdColumn}` = :id");
$userUpdate->bindParam(':id', $userId);
$userUpdate->bindParam(':password', $passwordHash);
foreach($users->fetchAll() as $row){
$userId = $row['id'];
$passwordHash = password_hash($row['password'], PASSWORD_DEFAULT);
$userUpdate->execute();
}
}
链接地址: http://www.djcxy.com/p/3719.html