我是一个非常新的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)
任何的想法?
我们来详细研究一下:
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 ==标志.
你缺少AND的WHERE 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):
关于Location:user.html你确定要使用.html文件吗?如果您没有指示Apache将.html文件视为PHP并且没有条件语句来检查会话是否已设置并且等于您为其分配的内容,那么任何人都可以访问该文件.
我注意到你可能用纯文本存储密码.如果是这种情况,则非常气馁.
建议使用CRYPT_BLOWFISH或PHP 5.5的password_hash()功能.
对于PHP <5.5使用password_hash() compatibility pack.