SQL查询用户名:密码

时间:2016-05-07 23:01:34

标签: php mysql sql

我为只有注册页面的游戏服务器创建一个网页。所有用户都已注册,并且由于某些原因,它将密码保存为用户名:密码,因此如果用户名为Meko且密码为1234,则实际密码为" Meko:1234"我现在正在尝试登录,但我不确定应该如何检查密码。我有这个SQL查询,并尝试在前面添加$ user_username:但它似乎没有工作:

$query = "SELECT * FROM account
              WHERE username = '$user_username'
              AND   sha_pass_hash = '$user_password'";

它必须是$ user_username:$ user_password

我希望你能帮助我:)。

4 个答案:

答案 0 :(得分:1)

我认为你在php上?

$username = 'Meko';
$user_password = '1234';
$altered_pass = $user_username.':'.$user_password;

if($stmt = mysqli_prepare($con,"select * from account where username = ? and sha_pass_hash = ?") ){

    mysqli_stmt_bind_param($stmt,'ss',$user_username,sha1($altered_pass));
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    if(mysqli_stmt_num_rows($stmt)){
        //"yup";
    }
    else{
        //"nope";
    }

    mysqli_stmt_close($stmt);
}
mysqli_close($con);

答案 1 :(得分:1)

如果您在数据库中存储的是SHA1校验和,那么您需要进行比较。

细节非常粗略。

假设该行已作为

保存到数据库中
 INSERT INTO `account` (`username`, `sha_pass_hash`, ...
 VALUES ('Meko', SHA1('Meko:1234'), ...

然后检查该行是否存在,给定:

 $user_username = 'Meko' ;
 $user_password = '1234' ;

如果这些是您要传递到数据库查询的值,那么

 $sql = 'SELECT ... 
           FROM account a
          WHERE a.username      = ?
            AND a.sha_pass_hash = SHA1( CONCAT( ? ,':', ? )';

 $sth = $dbh->prepare($sql);
 $sth->bindValue(1,$user_username, PDO::PARAM_STR);
 $sth->bindValue(2,$user_username, PDO::PARAM_STR);
 $sth->bindValue(3,$user_password, PDO::PARAM_STR);
 $sth->execute();
 if( $row = $sth->fetch(PDO::FETCH_ASSOC) ) {
     // matching row found
 } else {
     // no matching row found
 }
 $sth->closeCursor();

如果您没有使用MySQL SHA1函数并使用其他函数来计算哈希值,那么在进行检查时请使用相同的函数。

也就是说,如果通过更像

的表单的语句插入行
INSERT INTO account (username, sha_pass_hash, ... ) 
VALUES ('Meko','7c4d046a92c441c426ce86f15fa9ecd1fc1fd5f1', ... )

然后检查该行是否存在,给定:

 $user_username = 'Meko' ;
 $user_password = '1234' ;

然后你的查询检查行的存在将是这样的:

 $sql = 'SELECT ... 
           FROM account a
          WHERE a.username      = ?
            AND a.sha_pass_hash = ?';

计算密码哈希值,与最初完成时的方式相同

 $user_sha_hash = sha1( $user_username . ':' . $user_password) ; 

准备并执行查询,传入SHA校验和字符串

 $sth = $dbh->prepare($sql);
 $sth->bindValue(1, $user_username, PDO::PARAM_STR);
 $sth->bindValue(2, $user_sha_hash, PDO::PARAM_STR);
 $sth->execute();
 if( $row = $sth->fetch(PDO::FETCH_ASSOC) ) {
      //
 } else {
      //
 )
 $sth->closeCursor();

答案 2 :(得分:0)

您没有明确指定,但假设您的sha_pass_hash包含以下格式的散列值:hash(用户名:密码)然后首先散列'$ user_username'+“:”+'$ user_password'然后将其与您的密码。

答案 3 :(得分:-3)

$search = $username.":".$password;
$query = "SELECT * FROM account WHERE password = ".$search;

重要:

我非常希望您准备好您的语句并绑定参数以防止SQL注入攻击。如果您不是,请告诉我,我可以更详细地帮助您,以确保您的数据库安全。

另外,我建议您创建另一个表并使用此account表中的值填充它。上一个答案是一个快速修复,以便您的用户可以同时登录,但绝不应该保留上一个表。

如果您需要更多帮助,请告诉我们。)