首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用返回0的查询行比较mysql密码散列(不工作)

使用返回0的查询行比较mysql密码散列(不工作)
EN

Stack Overflow用户
提问于 2015-03-16 14:50:35
回答 2查看 220关注 0票数 3

我正在为我的网站创建一个使用mysql数据库的登录系统。

当用户注册时,它会使用以下方法将密码保存到数据库:

代码语言:javascript
运行
复制
$password = hash("sha512","somesalt".$password."moresalt");

然后,在登录时,使用相同的哈希函数将输入的密码与数据库中的密码进行比较。

为了比较数据库,我使用以下方法:

代码语言:javascript
运行
复制
$query = mysql_query("select * from users where password='$password' AND email='$email'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1) {//do login stuff}

但是行总是返回0。当我从寄存器和登录中删除哈希函数时,它会很好地登录。怎么了?

顺便提醒一下,如果有人想知道,我会使用mysqli,但我的网站托管的数据库版本是旧的。我相信他们用的是5.2。

我忘了提到,我确实检查了数据库,以确保数据库符合在这些图片中看到的结果(不能嵌入图片,所以链接):

u6weYp5wTCQng5eVhTSkZFRDg/view?usp=sharing u6weYp5wTCQVRXTkNqdzhWUFE/view?usp=sharing

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 14:54:43

数据库中密码字段的长度是多少?

在我看来,原因似乎是哈希密码长度太长,当保存到数据库部分或它被删除.

然后当你比较你得到0行..。

票数 3
EN

Stack Overflow用户

发布于 2015-03-16 15:10:28

好的,我建议您使用mysql库以外的准备语句。它更安全,更可靠。

代码语言:javascript
运行
复制
$query = "SELECT * FROM `users` WHERE AND `email`=:email_token";

然后准备并执行查询。

代码语言:javascript
运行
复制
$data = $connection->prepare($query);
try {
$data->bindParam(":email_token",$_POST["email"],PDO::PARAM_STR);
$data->execute();
}
$result = $data->fetch(PDO::FETCH_ASSOC);
while($row = $result) {
$out = $row["password"];
}
if($out == $_POST["password"]) {
//loggin
} else {
//get lost
}

这是一个非常基本的结构,但本质上您希望先从数据库中提取密码,然后比较字符串,而不是使用查询完成所有这些操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29079835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档