这样做是不明智的吗?我正在谈论的是将用户名和密码传递给处理文件,如下所示:
echo'<script>location.href="process.php?u='.$_POST['username'].'&p='.md5($_POST['password']).'"</script>';
这是在验证了用户名和密码之后。这可能以某种方式被恶意拦截?或者这是否足够安全?
答案 0 :(得分:4)
这是一件非常糟糕的事情。所有用户数据都应存储在$_SESSION
中,或者您应设置验证Cookie并将其用于身份验证。
此外,您永远不应该“保留”用户的密码。您应该对其进行哈希并将哈希值存储在数据库中,然后根据登录时的哈希检查发布的密码。
此外,您的哈希应该是一种方式,您应该无法检索或查看用户的原始密码。
最后,MD5被击败了。它不再是远程安全的,可以通过彩虹表攻击拆除。你应该研究一些更强大,更慢(慢慢好)的东西,比如bcrypt。
答案 1 :(得分:4)
请勿这样做
在那里,现在我们已经清除了,请允许我解释......
您实际上在做的是以明文形式将此数据发送给用户。即使您使用SSL加密进行传输,它仍然是一个很大的风险。它不是“在浏览器中呈现”,但这并不重要。它仍然被发送到浏览器。即使在这种特殊情况下你没有遇到任何问题,这也是一个不好的习惯。
您甚至可能会问,“但我正在使用md5()
,因此密码被遮盖了,对吧?”
错误。
文字模糊不清,是的。但是,您将文本的模糊版本提供给客户端,然后键入该文本。这意味着你仍然会显示一个有效的密码供所有人查看。
如果密码是“correcthorsebatterystaple”,那么你不想以纯文本显示它,因为这会给某人一个密码,对吧? (事实上,你甚至不想以纯文本存储它。无处不在。作为网站管理员,你甚至不想知道或拥有< em>任何方式来查找密码文本。如果可以,其他人可以。)对。
因此,您将密码隐藏为“elughwelfguweliurgnswfglwerlgu”,您的代码将其解释为密码。所以你可以显示,对吗?错误。因为现在,通过从客户端接受“elughwelfguweliurgnswfglwerlgu”作为密码,您已将“elughwelfguweliurgnswfglwerlgu”制作成系统接受的纯文本密码。因此,文本的模糊无效。
简而言之,永远不要以任何形式向任何人提供密码。您的应用程序应接收密码作为输入,但从不以任何方式将其作为输出生成。
答案 2 :(得分:1)
否否否
当某人输入密码来设置帐户(或更改密码)时,请使用POST和SSL。
否则,密码是单行道,网址中没有MD5或纯文本。
当用户登录时为他们提供会话。这可能会失效,因此无效。
截获 - 你可以获得一个数据包嗅探器
答案 3 :(得分:1)
这会以某种方式被恶意拦截吗?
是。任何人都可以查看页面的来源并查看用户名和密码的md5哈希值。当页面重定向用户时,它也会显示在浏览器的URL中。
是否可以通过中间人攻击拦截?不必要。如果您使用的是HTTPS,则会在SSL数据包中加密查询字符串以及请求的其余部分。如果您没有使用HTTPS,那么任何人都可以看到查询字符串,因此您知道,在查看中间人攻击时,GET与POST一样安全。
这里很好地比较了GET在HTTPS环境中的安全性如何:Is an HTTPS query string secure?