Php base64_编码奇怪的行为

Php base64_编码奇怪的行为,php,base64,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 'we

我正在做如下的事情:

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

尝试使用
var\u dump
而不是echo-可能其中一个在开始/结束处有空格或换行符

编辑:

您必须将其存储为CHAR(40):
一个固定长度的字符串,在存储时总是用空格右键填充到指定长度


使用VARCHAR或
trim()

最后试试这个:

echo "<br />$myrow[1] != $somepass";
echo“
$myrow[1]!=$somepass”;
上面说什么


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

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

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

似乎不知何故,如果我使用控制台将数据插入数据库,它会向pass字段添加一个额外的空间


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

这种编码有两个作用:

  • 它添加了代码,使代码更复杂,更容易出错
  • 如果你在屏幕上查看数据库,有人从你身后看,密码可能会更难记住
  • 因此,它并没有真正增加任何安全性。这只是一种编码,很容易解码

    也许你把它误认为是md5哈希之类的东西

    到处玩是很好的,但是说到安全性,我真的建议不要使用你不懂的东西。从长远来看,它将造成更多的损害而不是好处。

    一些问题:

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

    • 在存储到数据库之前使用base64_编码是不安全的。好的做法是只在数据库中存储密码的单向散列——通常是md5或(更好的)sha1。然后,当用户想要登录时,对提供的密码使用相同的哈希函数,然后比较两个哈希
      这还有一个额外的好处,就是使用长度超过40个字符的密码。
      sha1或md5散列总是占用固定的空间量,因此,如果您采用这种方式,就不必将数据库列切换到VARCHAR:)


    请提供一些有关$myrow和$\u POST实际包含的内容的信息(var\u dump($myrow);和var\u dump($\u POST);)var\u dump($somepass);var_dump($myrow);并将输出粘贴到您的问题中。哪个数据库?密码字段使用哪种列类型?可逆函数并不比纯文本更好。您可能需要查看crypt()函数: