我有一个登录表单,将信息传输到同一页面的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的结果等于数据库中的信息
的代码
<?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_hash
和password_verify
为您和您的用户的安全。好习惯从家里开始。- 也不要
trim
用户密码。不要对密码变量进行任何更改(直到它们被password_verify
编辑之后),因为如果我想要使用"dickens !"作为我的密码,为什么我不应该这样做呢?
- 也不要
-
有了上面的代码更改,脚本上就不需要
test_input
函数了。- 并且不需要在电子邮件地址上添加
test_input
,因为您随后直接使用filter_var
验证它。效率低下。
- 并且不需要在电子邮件地址上添加
好运。