用户仍然可以登录虽然插入的电子邮件和密码错误,为什么?

ken*_*ken 0 php mysql

我是一个非常新的PHP语言..目前我正在登录和注册系统.但我不知道为什么用户仍然可以登录到虽然电子邮件和密码插入是错误的,因为我已经做了所有的验证.所以伙计们,请帮助我看看我的代码,看看问题出在哪里.

这是我的代码

<?php
include('config.php');

    session_start();

    $errors=array();

 if ($_SERVER["REQUEST_METHOD"] == "POST"){

    $email = $_POST['email'];
    $password = $_POST['password'];

    if($email&&$password){

        //declare variable
        $query = mysqli_query($con,"SELECT * FROM user WHERE Email='$email' Password=''$password");
        $numrows = mysqli_num_rows($query);

        //when user correct input,check the data 
        if($numrows !== 0) {
            while($row=mysqli_fetch_assoc($query)){
                $dbemail=$row['Email'];
                $dbpassword=$row['Password'];
            }
            //if username and password match
            if($dbemail=$email&&$dbpassword=$password)
            {
                $SESSION['$email']="$email";
                header('Location:user.html');

            }

            else
            {
                $errors['notcorrect'] = "Email or password not correct";
            }
        } 
        //when insert wrong data
        else{
            $errors['notexists'] = "This email doesn't exists";
        }
    }
    //when user didnt enter anything
    else{
        $errors['nothing'] = "Please enter your email and password";
    }
}

?>
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Fun*_*ner 5

我们来详细研究一下:

  • Password=''$password"
  • $SESSION
  • if($dbemail=$email&&$dbpassword=$password)
  • WHERE Email='$email' Password=''$password")
  • $_SESSION['$email']="$email";

$password 超出你的报价.

然后$SESSION缺少$和之间的下划线SESSION.

然后你使用1x =符号"分配" 而不是"比较"if($dbemail=$email&&$dbpassword=$password)

使用2x ==标志.

你缺少ANDWHERE Email='$email' Password=''$password")

WHERE Email='$email' AND Password='$password'");
Run Code Online (Sandbox Code Playgroud)

你也应该,并建议exit;在标题后添加.

header('Location:user.html');
exit;
Run Code Online (Sandbox Code Playgroud)

否则,您的代码可能会继续执行.

$_SESSION['$email']="$email"; 有一个美元符号 ['$email']

它需要读作['email'].


边注:

您现在的代码对SQL注入是开放的.使用准备好的语句,或PDO与准备好的语句,它们更安全.


脚注(S):

  1. 关于Location:user.html你确定要使用.html文件吗?如果您没有指示Apache将.html文件视为PHP并且没有条件语句来检查会话是否已设置并且等于您为其分配的内容,那么任何人都可以访问该文件.

  2. 我注意到你可能用纯文本存储密码.如果是这种情况,则非常气馁.

建议使用CRYPT_BLOWFISH或PHP 5.5的password_hash()功能.
对于PHP <5.5使用password_hash() compatibility pack.


  • 正如中国谚语所说的那样:"向人展示如何捕鱼,终身养活他."