我是一个非常新的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";
}
}
?>
任何想法?
答案 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 statements或PDO with prepared statements,他们更安全。
脚注(S):
关于Location:user.html
您确定要使用.html
文件吗?如果您没有指示Apache将.html
文件视为PHP并且没有条件语句来检查会话是否已设置且等于您分配给它的那个,则任何人都可以访问该文件
我注意到您可能以纯文本格式存储密码。如果是这种情况,则非常气馁。
建议使用CRYPT_BLOWFISH或PHP 5.5&#39; password_hash()
功能
对于PHP&lt; 5.5使用password_hash() compatibility pack
。
答案 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}' ");
并使用===
这样的
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";
}
}
?>