用户不能使用有效的电子邮件和密码登录到他的帐户


user can't login to his account using the valid email and password

我有一个登录表单,将信息传输到同一页面的PHP代码,但即使用户名和密码是正确的,它总是忽略他这是我的PHP代码:

$mail = test_input($_POST["email"]);
//check if the email address format is valid
  if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
  echo "<h3>Invalid email format</h3>";
  }
$pass = trim($_POST["password"]);
$stmtn="SELECT first_name, email , password FROM `users` WHERE email= '$mail'";
$result = mysqli_query($connection,$stmtn);
$rows=  mysqli_fetch_assoc($result);
if($rows && $rows['password']==  md5($pass)){
    session_start();
    $_SESSION['username']=$rows['first_name'];
    header("Location: index.php");
}else{
    echo "<h3> Sorry! your email or password is incorrect </h3>";
    echo "<h3> Please <strong><a href='login.php'>login</a></strong> again to your account </h3>";
    echo var_dump($rows);

}



else部分的语句总是被执行,数组$rows的var_dump的结果等于数据库中的信息

这是函数test_input
的代码
<?php
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
  • 请停止使用stripslashes,它真的不需要。相反,您应该使用filter_var或regex正确地清理用户输入。

  • 在你设置了header()为重定向之后,你应该总是并且立即设置一个exit语句来停止脚本的执行。

  • 你真的,真的应该在MySQLi中使用参数化查询来阻止你的SQL被滥用和攻击(在这个问题上达到顶峰只是为了了解参数化MySQLi的布局)

  • 停止使用md5。现在。如果你的PHP是5.3以上,你真的,真的应该使用password_hashpassword_verify为您和您的用户的安全。好习惯从家里开始。

    • 也不要trim用户密码。不要对密码变量进行任何更改(直到它们被password_verify编辑之后),因为如果我想要使用"dickens !"作为我的密码,为什么我不应该这样做呢?
  • 有了上面的代码更改,脚本上就不需要test_input函数了。

    • 并且不需要在电子邮件地址上添加test_input,因为您随后直接使用filter_var验证它。效率低下。

好运。