我为只有注册页面的游戏服务器创建一个网页。所有用户都已注册,并且由于某些原因,它将密码保存为用户名:密码,因此如果用户名为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
我希望你能帮助我:)。
答案 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
表中的值填充它。上一个答案是一个快速修复,以便您的用户可以同时登录,但绝不应该保留上一个表。
如果您需要更多帮助,请告诉我们。)