用户名和密码验证在PHP中不起作用?

时间:2012-02-16 18:31:18

标签: php login session-variables session-cookies

我在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";
        }    

    }

}

请告诉我这段代码有什么问题,以及为什么它不起作用。

2 个答案:

答案 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);
    }

重要提示

上面的代码只说明代码中的逻辑问题所在。还有另外两个严重问题:

  1. 易受SQL injection攻击。使用准备好的陈述是常见的做法如果您无法使用准备好的声明,请使用$SAFE_USER_DATA = array_map('mysql_real_escape_string', $_POST);之类的内容并使用此内容而不是直接阅读$_POST数据。这样,您就可以确保没有恶意用户可以修改您的SQL语句来访问您的系统。

  2. 您永远不应将密码存储为纯文本 - 鼓励存储 salted SHA1密码哈希。不要只使用md5($password)。攻击者可以在rainbow tables

  3. 的帮助下轻松解密