base64_encode奇怪的行为

时间:2008-10-17 20:13:17

标签: php base64

我正在做以下事情:

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]它们是相同的,但仍然是错误的。我究竟做错了什么?感谢

5 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

最后试试这个:

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

它说什么?

顺便说一下:我认为没有任何理由对密码进行base64编码。你想要完成什么?

答案 2 :(得分:0)

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

string(40)“YWRraM2 =” string(8)“YWRraM2 =”

如果我使用控制台将数据插入数据库,它会在某种程度上为传递字段添加额外的空间。

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

答案 3 :(得分:0)

这种编码做了两件事:

  1. 它添加了代码,使其更复杂,更容易出错
  2. 如果您在屏幕上查看数据库,并且有人看着您,那么密码可能会更难记住。
  3. 所以不,它并没有真正添加任何安全性。它只是一种编码,很容易解码。

    也许你误以为md5-hashing或类似的东西。

    玩得很好,但是在安全方面,我真的建议不要使用你不理解的东西。从长远来看,它会造成更大的伤害。

答案 4 :(得分:0)

一些问题:

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

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