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

时间:2014-12-19 12:16:25

标签: 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";
    }
}

?>

任何想法?

5 个答案:

答案 0 :(得分:5)

让我们详细研究这些:

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

$password超出了您的报价。

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

然后你就是&#34;分配&#34;使用1x =符号代替&#34;比较&#34;与if($dbemail=$email&&$dbpassword=$password)

使用2x ==标志。

您错过了AND

WHERE Email='$email' Password=''$password")
WHERE Email='$email' AND Password='$password'");

您还应该,并建议在标题后添加exit;

header('Location:user.html');
exit;

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

$_SESSION['$email']="$email"; ['$email']

中有一个美元符号

需要读作['email']


旁注:

您目前的代码向SQL injection开放。使用prepared statementsPDO with prepared statements他们更安全


脚注(S):

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

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

  3. 建议使用CRYPT_BLOWFISH或PHP 5.5&#39; password_hash()功能 对于PHP&lt; 5.5使用password_hash() compatibility pack


    • 正如中国谚语所说:&#34;向男人展示如何钓鱼,终身养活他。&#34;

答案 1 :(得分:2)

更新此

 $query = mysqli_query($con,"SELECT * FROM user WHERE Email='$email' AND Password='$password' ");

并且还将会话超级全局从$ SESSION更正为$ _SESSION

答案 2 :(得分:1)

您忘记的选择查询中的错误和操作符

$query = mysqli_query($con,"SELECT * FROM user WHERE Email='{$email}' AND Password='{$password}' ");

并使用===这样的

更改equle运算符
if($dbemail===$email&&$dbpassword===$password)

我希望成功运作

答案 3 :(得分:0)

你正在做一个你应该进行比较的作业:

if($dbemail=$email&&$dbpassword=$password)

应该是

if($dbemail == $email && $dbpassword == $password)

空白使事物更具可读性。

答案 4 :(得分:0)

更新您的代码

<?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' AND 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');
                die();
            }

            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";
    }
}

?>