即使使用了错误的用户名和密码,登录仍然会直接进入主页(PHP/mySql)
即使使用了错误的用户名和密码,我的登录表单仍能正常工作。我试图寻找答案,但我找不到我的错误。下面的代码:即使使用了错误的用户名和密码,登录仍然会直接进入主页(PHP/mySql)
<?php
include 'database.php'; ?>
<?php
if($_SERVER["REQUEST_METHOD"] == "POST"){
$username = mysqli_real_escape_string($connect,$_POST['username']);
$password = mysqli_real_escape_string($connect,$_POST['password']);
$query = "SELECT username, password FROM tbl_membership WHERE username =
'$username' AND password = '$password'";
$result = mysqli_query($connect, $query);
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
$active = $row['active'];
$count = mysqli_num_rows($result);
if(mysqli_num_rows($query) > 0){
$_SESSION["username"] = $username;
$_SESSION["password"] = $password;
header("location: welcome.php");
exit();
}if (mysqli_num_rows($query) != 0){
echo "Invalid.";
}
}
?>
if($_SERVER["REQUEST_METHOD"] == "POST"){
$username = mysqli_real_escape_string($connect,$_POST['username']);
$password = mysqli_real_escape_string($connect,$_POST['password']);
$query = "SELECT username, password FROM tbl_membership WHERE username =
'$username' AND password = '$password'";
$result = mysqli_query($connect, $query);
$row = mysqli_fetch_assoc($result);
$count = mysqli_num_rows($result);
if($count > 0){
$_SESSION["username"] = $row['username'];
$_SESSION["password"] = $row['password'];//no need to use password in session
header("location: welcome.php");
}else{
echo "Invalid.";
}
}
没有解释吗?一个好的答案包括对你改变了什么的解释,为什么以及如何解决问题。不要只发布一段代码,因为它不具有建设性。顺便说一句,OP不应该使用这种方式,因为它没有使用准备好的语句,仍然依靠使用明文密码。 –
@MagnusEriksson我的老师告诉我没有不好的问题和很好的答案。答案在“回答”问题时有效。一些解释是非常有用的,虽然:) – Peter
@彼得不是_that_家伙,但我强烈不同意你的老师。 :-) –
1:
在该行看看:
if(mysqli_num_rows($query) > 0) {
变量$query
是这里的字符串。您将需要使用刚刚设置的$count
变量。
// Check if we have a result and just one result
if($count == 1) {
2:
你只需要得到该行的内容,如果有一个结果。
$count = mysqli_num_rows($result);
if ($count == 1) {
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
$active = $row['active'];
}
3:
尝试使用准备好的语句,以避免SQL注入。在这种情况下,转义字符串是一个好的开始。
$stmt = $conn->prepare("SELECT username, password FROM tbl_membership WHERE username =? AND password =?");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$get_result = $stmt->get_result();
$row_count = $get_result->num_rows;
if ($row_count == 1) {
$row = $get_result->fetch_assoc();
$active = $row['active'];
$_SESSION["username"] = $username;
header("location: welcome.php");
exit();
} else {
echo "Invalid.";
}
4:
不要保存密码为纯文本。强烈建议您不要这样做,并为您的客户/访问者创建安全问题。改为使用某种形式的散列。 Read the documentation for more info
**切勿以明文形式存储密码!**。只存储密码哈希!使用PHP的['password_hash()'](http://php.net/manual/en/function.password-hash.php)和['password_verify()'](http://php.net/manual/en /function.password-verify.php)。如果您运行的PHP版本低于5.5(我希望不是),那么可以使用[password_compat库](https://github.com/ircmaxell/password_compat)来获得相同的功能。 –
了解预防SQL注入的语句 – Jens
如果使用$ count而不是mysqli_num_rows($ query)if – Jens