我在PHP中编写了一个函数来检查MySQL数据库中的用户名和密码,并在成功验证后存储为会话。但无论我输入到输入框的任何值,它都会批准它并成功登录。我的登录代码不起作用
这里是
function queryByUserAndPass($tableName, $username, $password){
$queryStatement = "SELECT * FROM ".$tableName." WHERE username='".$username."'
AND password='".$password."' LIMIT 1";
return $queryStatement;
}
function checkLogIn() {
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$queryState = queryByUserAndPass("nepal_users", $username, $password);
if( $resultQuery = mysql_query($queryState) ){
$found_user= mysql_fetch_array($resultQuery);
$_SESSION['id']=$found_user['id'];
$_SESSION['username']=$found_user['username'];
$message="succesful log in ".$_SESSION['username'];
header("location:home.php");
exit;
}else {
$message="error in log in";
}
}
}
请告诉我这段代码有什么问题,以及为什么它不起作用。
答案 0 :(得分:3)
mysql_query
总是在成功时返回资源,如果代码中存在错误,则返回false。
您想要做的是:
$resultQuery = mysql_query($queryState);
if( $found_user = mysql_fetch_assoc($resultQuery)) {
// do login stuff
// note I used "fetch_assoc" above, because you don't use numeric indices here.
}
else $message = "Error";
答案 1 :(得分:0)
你不检查用户名和密码是否正确!
if( $resultQuery = mysql_query($queryState) ){
$found_user = mysql_fetch_array($resultQuery);
if ($username === $found_user['username'] &&
$password === $found_user['password']) {
$_SESSION['id']=$found_user['id'];
$_SESSION['username']=$found_user['username'];
$message="succesful log in ".$_SESSION['username'];
header("Location: home.php");
exit;
} else {
echo "wrong username or password";
}
}else {
$message="error from database: " . mysql_errno($resultQuery);
}
重要提示
上面的代码只说明代码中的逻辑问题所在。还有另外两个严重问题:
易受SQL injection攻击。使用准备好的陈述是常见的做法如果您无法使用准备好的声明,请使用$SAFE_USER_DATA = array_map('mysql_real_escape_string', $_POST);
之类的内容并使用此内容而不是直接阅读$_POST
数据。这样,您就可以确保没有恶意用户可以修改您的SQL语句来访问您的系统。
您永远不应将密码存储为纯文本 - 鼓励存储 salted SHA1密码哈希。不要只使用md5($password)
。攻击者可以在rainbow tables