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