1

我正在做类似以下的事情:

SELECT * FROM table WHERE user='$user';
$myrow = fetchRow() // previously I inserted a pass to the db using base64_encode ex: WRM2gt3R=

$somepass = base64_encode($_POST['password']);

if($myrow[1] != $somepass) echo 'error';
else echo 'welcome';

我总是出错,我什至回显 $somepass 和 $myrow[1] 它们是相同的,但仍然是错误。我究竟做错了什么?谢谢

4

5 回答 5

2

尝试使用var_dump代替 echo - 也许其中一个在开始/结束处有空格或换行符。

编辑:

您必须将其存储为 CHAR(40):A fixed-length string that is always right-padded with spaces to the specified length when stored

使用 VARCHAR 或trim()

于 2008-10-17T20:18:29.813 回答
0

如果 $myrow[1] 实际上是 base64 编码中的正确密码,我看不到任何错误。

最后试试这个:

echo "<br />$myrow[1] != $somepass";

它说什么?

顺便说一句:我看不出有任何理由对密码进行 base64 编码。你想达到什么目的?

于 2008-10-17T20:20:31.637 回答
0

我想如果我做一个 var_dump() 我会得到:

字符串(40)“YWRraM2=”字符串(8)“YWRraM2=”

如果我使用控制台将数据插入数据库,它似乎会以某种方式向 pass 字段添加额外的空间。

myplacedk:有什么理由我不应该这样做吗?我认为它会增加额外的安全性?

于 2008-10-17T20:30:19.587 回答
0

这种编码做了两件事:

  1. 它添加代码,使其更复杂,更容易出错
  2. 如果您在屏幕上查看您的数据库,并且有人在您的肩膀上看着,那么密码可能会更难记住。

所以不,它并没有真正增加任何安全性。它只是一种编码,很容易解码。

也许你把它误认为是 md5-hashing 或类似的东西。

到处玩是很棒的,但是说到安全性,我真的建议不要使用你不理解的东西。从长远来看,它弊大于利。

于 2008-10-17T20:38:39.197 回答
0

一些问题:

  • 根据您在其他地方的评论,我猜当前代码的问题在于您的数据库字段是 CHAR(40)。CHAR 字段始终具有固定大小。尝试将数据库字段类型更改为 VARCHAR 而不是 CHAR。

  • 在存储到数据库之前使用 base64_encode 远非安全。好的做法是在数据库中只存储密码的单向哈希——通常是 md5 或(更好的)sha1。然后,当用户想要登录时,对提供的密码使用相同的哈希函数,然后比较两个哈希值。
    这还具有使用超过 40 个字符的密码的额外好处。
    sha1 或 md5-hash 总是占用固定数量的空间,所以如果你走这条路,你不必将你的数据库列切换到 VARCHAR :)

于 2008-10-17T20:42:52.573 回答