【发布时间】:2017-02-25 20:11:47
【问题描述】:
我知道这个问题已经被问过很多次,但没有一个对我有用。我正在尝试创建一个简单的登录系统,它使用 password_hash() 和 password_verify() 我的数据库在密码上有 varchar(255) 只是为了确保它不会剪掉哈希的末尾,我已经确保哈希是由password_hash()生成的和数据库里的一模一样,没人看到问题吗?
这是我的 register.php 页面
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<input type="text" name="username" placeholder="username">
<input type="password" name="password" placeholder="password">
<input type="submit" name="register" value="register">
</form>
<?PHP
if(isset($_POST['register'])){
require_once('connect.php');
$conn = connUsers('write');
$stmt = $conn->prepare("INSERT INTO users(user, pass)
VALUES(:user, :pass)");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':pass', $hash);
$pass = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
$user = $_POST['username'];
$stmt->execute();
echo '<script>alert("User successfully created");</script>';
}
?>
</body>
这是我的 login.php 页面
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form name="login-form" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="login" value="login">
</form>
</body>
<?PHP
require_once('connect.php');
$conn = connUsers('read');
if(isset($_POST['login'])){
$user = $_POST['username'];
$pass = $_POST['password'];
$checkUser = null;
$sql = "SELECT id, user, pass FROM users WHERE user = '$user'";
$result = $conn->query($sql);
foreach($result as $check){
$checkUser = $check['user'];
$hash = $check['pass'];
}
if(is_null($checkUser)){
echo '<script>alert("User does not exist");</script>';
}else{
if(password_verify($pass, $hash)){
echo '<script>alert("you have successfully logged in");</script>';
}else{
echo '<script>alert("Incorrect password");</script>';
}
}
}
?>
谁能看出问题所在?
【问题讨论】:
-
你在第一部分绑定参数做得这么好,然后在第二部分公然允许SQL注入......?!
-
您是否仔细检查过在 PHP 中生成的、输入到数据库中然后从其中检索回来的哈希值是否完全相同?明文密码也一样?
-
是的,我已确保 register.php、数据库和 login.php 中的哈希值保持不变