这是我的login.php页面
<?php echo $loginError; ?>
<form class="form-inline" action="<?php echo htmlspecialchars( $_SERVER['PHP_SELF'] ); ?>" method="post">
<div class="form-group">
<label for="login-username" class="sr-only">Username</label>
<input type="text" class="form-control" id="login-username" placeholder="username" name="username">
</div>
<div class="form-group">
<label for="login-password" class="sr-only">Password</label>
<input type="password" class="form-control" id="login-password" placeholder="password" name="password">
</div>
<button type="submit" class="btn btn-default" name="login">Login!</button>
</form>
这是我验证密码的地方
if( isset( $_POST['login'] ) ) {
// build a function to validate data
function validateFormData( $formData ) {
$formData = trim( stripslashes( htmlspecialchars( $formData ) ) );
return $formData;
}
// create variables
// wrap the data with our function
$formUser = validateFormData( $_POST['username'] );
$formPass = validateFormData( $_POST['password'] );
// connect to database
include('connection.php');
// create SQL query
$query = "SELECT username, email, password FROM users WHERE username='$formUser'";
// store the result
$result = mysqli_query( $conn, $query );
// verify if result is returned
if( mysqli_num_rows($result) > 0 ) {
// store basic user data in variables
while( $row = mysqli_fetch_assoc($result) ) {
$user = $row['username'];
$email = $row['email'];
$hashedPass = $row['password'];
}
// verify hashed password with the typed password
if( password_verify( $formPass, $hashedPass ) ) {
// correct login details!
// start the session
session_start();
// store data in SESSION variables
$_SESSION['loggedInUser'] = $user;
$_SESSION['loggedInEmail'] = $email;
header("Location: profile.php");
} else { // hashed password didn't verify
// error message
$loginError = "<div class='alert alert-danger'>Wrong username / password combination. Try again.</div>";
}
} else { // there are no results in database
$loginError = "<div class='alert alert-danger'>No such user in database. Please try again. <a class='close' data-dismiss='alert'>×</a></div>";
}
// close the mysql connection
mysqli_close($conn);
}
&GT;
但问题是它总是返回&#34;错误的密码/用户名组合&#34; 。似乎问题出在password_verify()方法中。 我将密码设置为255 VARCHAR,我的php版本也是7.0.2
答案 0 :(得分:0)
我要解决的第一个问题是转义,密码输入不应该被转义,使用原始输入调用password_hash()函数是安全的。所以请勿拨打validateFormData()
,只需使用password_hash($_POST['password'])
。当然password_verify()
也是如此。验证输入是一件好事,但不能逃避,这应该尽可能晚地针对特定目标系统进行。
代码中的另一个问题可能是重复的用户名。如果你没有明确地检查现有的用户名,你可能会有重复项,然后你可以获得密码哈希。我会考虑使用电子邮件作为ID。
最后,您的代码容易受到SQL注入的影响,请考虑使用预准备语句。您可以在此answer中找到一个示例。
答案 1 :(得分:0)
$formPass = validateFormData( $_POST['password'] );
// connect to database
include('connection.php');
在您输入密码后输入include语句。因此,$password
变量必须用您的数据库密码覆盖。