2017-06-27 16 views
-1

即使使用了错误的用户名和密码,我的登录表单仍能正常工作。我试图寻找答案,但我找不到我的错误。下面的代码:即使使用了错误的用户名和密码,登录仍然会直接进入主页(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."; 
     } 
    } 
?> 
+0

**切勿以明文形式存储密码!**。只存储密码哈希!使用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)来获得相同的功能。 –

+0

了解预防SQL注入的语句 – Jens

+0

如果使用$ count而不是mysqli_num_rows($ query)if – Jens

回答

0
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."; 
    } 
} 
+1

没有解释吗?一个好的答案包括对你改变了什么的解释,为什么以及如何解决问题。不要只发布一段代码,因为它不具有建设性。顺便说一句,OP不应该使用这种方式,因为它没有使用准备好的语句,仍然依靠使用明文密码。 –

+0

@MagnusEriksson我的老师告诉我没有不好的问题和很好的答案。答案在“回答”问题时有效。一些解释是非常有用的,虽然:) – Peter

+0

@彼得不是_that_家伙,但我强烈不同意你的老师。 :-) –

1

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

相关问题