【问题标题】:Username and Password validate doesn't work in PHP?用户名和密码验证在 PHP 中不起作用?
【发布时间】:2012-03-08 04:29:45
【问题描述】:

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

    }

}

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

【问题讨论】:

  • 函数 queryByUserAndPass($tableName, $username, $password){ $queryStatement = "SELECT * FROM ".$tableName." WHERE username='".$username."' AND password='" .$password."' LIMIT 1";返回$查询语句; }
  • 你对用户密码没有加密吗??如果你有,你必须应用相同的方法
  • 记住在将用户名和密码输入数据库之前使用mysql_real_escape_string - 否则任何人都可以将' or 1='1 作为密码并访问他们选择的用户名。
  • 请清理您的数据流/准备好的语句、mysql_escape_string、mysql_real_escape_string、addslashes .../并始终使用加密哈希算法来保护您的密码/加盐/。

标签: php login session-variables session-cookies


【解决方案1】:

你不检查用户名和密码是否正确!

    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); 之类的东西,并使用它而不是直接读取$_POSTdata。这样可以确保没有恶意用户可以修改您的 SQL 语句来访问您的系统。

  2. 您不应该将密码存储为纯文本 - 鼓励存储 salted SHA1 密码哈希。不要简单地使用md5($password)。攻击者可以借助rainbow tables

  3. 轻松解密那些

【讨论】:

  • 可以安全地假设用户名和密码被queryByUserAndPass函数放入查询中。
  • @Kolink 你是对的,在我发布我的答案后,OP 在评论中发布了该功能。但是,此处说明的快速修复也应该有效。尽管存在关于 SQL 注入和丢失密码哈希的严重问题,但是..
【解决方案2】:

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
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 2018-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多