用户无法使用有效的电子邮件和密码登录其帐户

时间:2016-10-25 20:03:59

标签: php

我有一个登录表单,将信息传输到同一页面中的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;
}

1 个答案:

答案 0 :(得分:2)

  • 请停止使用stripslashes,确实不需要它。相反,您应该使用filter_var或正则表达式正确清理用户输入。

  • 在您将header()设置为重定向后,您应该 始终立即 设置exit语句以停止脚本执行。

  • 你真的,真的应该使用MySQLi的参数化查询来阻止你的SQL被滥用和攻击(在this question取一个峰值只是为了调整参数化的布局库MySQLi)

  • 停止使用md5。现在。如果您的PHP是above 5.3,那么您真的应该使用password_hashpassword_verify来保护您和您的用户安全。好习惯从家里开始。

    • 也不要trim用户密码。根本不对密码变量进行任何更改(直到他们password_verify之后),因为如果我想要&#34;狄更斯!&#34;作为我的密码,为什么我不应该?
  • 通过上面的代码更改,您的脚本根本不需要test_input功能。

    • 电子邮件地址无需test_input,因为您之后会直接使用filter_var对其进行验证。低效的。
祝你好运。

相关问题