我有一个登录表单,将信息传输到同一页面中的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;
}
答案 0 :(得分:2)
请停止使用stripslashes
,确实不需要它。相反,您应该使用filter_var
或正则表达式正确清理用户输入。
在您将header()
设置为重定向后,您应该 始终立即 设置exit
语句以停止脚本执行。
你真的,真的应该使用MySQLi的参数化查询来阻止你的SQL被滥用和攻击(在this question取一个峰值只是为了调整参数化的布局库MySQLi)
停止使用md5
。现在。如果您的PHP是above 5.3,那么您真的应该使用password_hash
和password_verify
来保护您和您的用户安全。好习惯从家里开始。
trim
用户密码。根本不对密码变量进行任何更改(直到他们password_verify
之后),因为如果我想要&#34;狄更斯!&#34;作为我的密码,为什么我不应该?通过上面的代码更改,您的脚本根本不需要test_input
功能。
test_input
,因为您之后会直接使用filter_var
对其进行验证。低效的。