我正在尝试在我的网站上构建一个受密码保护的区域。但是,在我的if
声明中,我无法确定阵列是否为空。运行代码时,无论放入user / pass字段的内容是什么,它都始终测试为true。作为参考,被访问的数据库只有1行,包含1个用户/通过组合。
function verify(){
$dbhost = "host";
$dbname = "db";
$dbuser = "user";
$dbpass = "password";
if (isset($_SESSION['valid_user']))return true;
$user_name = $_POST["user_name"];
$password = $_POST["password"];
if ($user_name && $password){
try{
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
}
catch(PDOException $pe){
die('Connection error, because: ' .$pe->getMessage());
}
$sql = "SELECT user_name FROM users WHERE user_name = ':user_name' AND password = ':password'";
$q = $conn->prepare($sql);
if(!$q){
die("Execute query error, because: ". $conn->errorInfo());
};
$q->execute(array(':user_name'=>$user_name, ':password'=>$password));
$result = $q->fetchALL();
if ($result['user_name']=$user_name){
$valid_user = $user_name;
$_SESSION['valid_user'] = $valid_user;
return true;
}
else{
$text = "User Name and Password did not match";
write_log_in($text);
}
}
else {
$text = "This is a secure server. Please log in.";
write_log_in($text);
}
}
作为旁注,我知道我的密码应至少以MD5哈希格式或类似方式存储。我只是想在添加更多东西之前让它工作。
答案 0 :(得分:2)
这是你的问题
if ($result['user_name']=$user_name){
应该是
if ($result['user_name']==$user_name){
但是为什么你不检查你是否有结果来确定用户是否正确。因为您在SQL查询中传递了用户。
答案 1 :(得分:1)
缺少等号:
if ($result['user_name'] == $user_name){
// ----------------------^
答案 2 :(得分:1)
$result['user_name']=$user_name
应为$result['user_name'] === $user_name
。
另外,请勿使用MD5。使用像hash_pbkdf2
这样的缓慢散列函数来散列密码,攻击费用很高。
答案 3 :(得分:-1)
你可以使用:if(mysql_num_rows($ result)== 0)因为如果没有reslut,输入passwd的用户不正确