题
我正在做类似以下的事情:
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:我有什么理由不这样做吗?我认为它会增加额外的安全性吗?
这种编码做了两件事:
- 它添加了代码,使其更复杂,更容易出错
- 如果您在屏幕上查看数据库,并且有人看着您,那么密码可能会更难记住。 醇>
所以不,它并没有真正添加任何安全性。它只是一种编码,很容易解码。
也许你误以为md5-hashing或类似的东西。
玩得很好,但是在安全方面,我真的建议不要使用你不理解的东西。从长远来看,它会造成更大的伤害。
一些问题:
- 从您在其他地方的评论来看,我猜当前代码的问题是您的数据库字段是 CHAR(40)。CHAR 字段始终具有固定大小。尝试将数据库字段类型更改为 VARCHAR 而不是 CHAR。
- 在存储到数据库之前使用 base64_encode 远不安全。好的做法是在数据库中仅存储密码的单向哈希 - 通常是 md5 或(更好)sha1。然后,当用户想要登录时,对提供的密码使用相同的哈希函数,然后比较两个哈希值。
这还有一个额外的好处,即可以使用长度超过 40 个字符的密码。
sha1 或 md5 哈希始终占用固定的空间量,因此如果您采用此方法,则不必将数据库列切换为 VARCHAR :)
不隶属于 StackOverflow