我正在为一个只有注册页面的游戏服务器创建一个网页。所有用户都注册了,出于某种原因,它将密码保存为username:password,所以如果用户名是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
我希望你能帮助我:)
如果数据库中存储的是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();
我觉得你在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);
您没有明确指定,但假设您的sha_pass_hash包含以下格式的哈希值:hash(用户名:密码),然后先哈希'$user_username'+":"+'$user_password',然后将其与您的密码进行比较。
$search = $username.":".$password;
$query = "SELECT * FROM account WHERE password = ".$search;
重要信息:
我非常希望您正在准备语句并绑定参数,以防止SQL注入攻击。如果你没有,请告诉我,我可以更详细地帮助你,这样你的数据库是安全的。
此外,我建议您创建另一个表,并用account
表中的值填充它。前面的答案是一个快速解决方案,这样你的用户就可以同时登录,但决不应该让前面的表保持原样
如果您需要更多帮助,请告诉我:)