https网址中的用户名和密码

时间:2011-02-12 22:04:02

标签: security https url-parameters

考虑网址: https://foo:password@example.com

上面示例中的用户名/密码部分是否符合this question中定义的“网址参数”?

1 个答案:

答案 0 :(得分:98)

当您将用户名和密码放在主机前面时,此数据不会以相同方式发送到服务器。而是根据使用的身份验证模式将其转换为请求标头。大部分时间这将是Basic Auth,我在下面描述。类似(但经常使用的频率较少)的身份验证方案是Digest Auth,现在提供了类似的安全功能。

使用Basic Auth,来自问题的HTTP请求将如下所示:

GET / HTTP/1.1
Host: example.com
Authorization: Basic Zm9vOnBhc3N3b3Jk

您在其中看到的类似字符串的字符串由浏览器创建,如下所示:base64_encode(username + ":" + password)

对于HTTPS传输的外部人员,此信息是隐藏的(与HTTP级别的其他信息一样)。您应该注意登录客户端和所有中间服务器。用户名通常显示在服务器日志中,但密码不会。但这并不能保证。当您在客户端上调用该URL时,例如curl,用户名和密码将在进程列表中清晰可见,并且可能会显示在bash历史记录文件中。

当您使用the approach by ayush时,用户名和密码将始终在您的网络服务器,应用程序服务器,缓存,...的服务器日志中显示,除非您专门配置服务器记录下来。这仅适用于能够读取未加密的http数据的服务器,例如您的应用程序服务器。

基本身份验证由浏览器标准化并通过显示此小用户名/密码弹出窗口实现。当您将用户名/密码输入通过GET或POST发送的HTML表单时,您必须自己实现所有登录/注销逻辑(这可能是一个优势)。但是你应该从不通过GET参数传输用户名和密码。如果必须,请改用POST。默认情况下会阻止记录此数据。

当实现具有用户/密码输入表单的认证机制以及当前常用的后续基于cookie的会话时,您必须确保使用POST请求或标准化身份验证方案之一传输密码仅限以上。

总结我可以说,通过HTTPS传输数据是安全的,只要你注意密码不会出现在意想不到的地方。但该建议适用于任何密码的任何转移。