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

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';

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

有帮助吗?

解决方案

尝试使用 var_dump 而不是echo - 也许其中一个在开头/结尾有一个空格或换行符。

编辑:

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

使用VARCHAR或 trim()

其他提示

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

最后试试这个:

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

它说什么?

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

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

string(40)&quot; YWRraM2 =&quot; string(8)&quot; YWRraM2 =&quot;

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

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

这种编码做了两件事:

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

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

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

一些问题:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top