我正在创建一个安全的基于Web的API,使用HTTPS; 但是,如果我允许用户使用查询字符串配置它(包括发送密码),这样做是否也安全,还是应该强制使用POST?
我正在创建一个安全的基于Web的API,使用HTTPS; 但是,如果我允许用户使用查询字符串配置它(包括发送密码),这样做是否也安全,还是应该强制使用POST?
是的,可以使用GET方法传输数据。但是对于敏感数据来说,使用GET方法是不明智的,有以下几个原因:
因此,即使查询字符串是安全的,也不建议通过查询字符串传输敏感数据。
[1] 尽管我需要注意的是RFC规定浏览器不应从HTTPS发送引用到HTTP。但这并不意味着恶意的第三方浏览器工具栏或来自HTTPS网站的外部图像/Flash不会泄露它。
从“嗅探网络数据包”的角度看,GET请求是安全的,因为浏览器会首先建立安全连接,然后发送包含GET参数的请求。但是,GET URL将被存储在用户浏览器历史记录/自动完成中,这不是一个好地方来存储密码等数据。当然,只有当您采用更广泛的“Web服务”定义,并从浏览器访问该服务时,才适用此规则;如果您仅从自定义应用程序访问,则不应该存在此问题。
因此,对于密码对话框,至少使用POST应该是首选。另外,正如littlegeek发布的链接所指出的那样,GET URL更可能被写入服务器日志。
是的,您的查询字符串将被加密。
原因是查询字符串是HTTP协议的一部分,而安全(SSL / TLS)部分来自传输层。先建立SSL连接,然后发送属于HTTP协议的查询参数到服务器。
建立SSL连接时,客户端将按以下顺序执行以下步骤。假设您正在尝试登录名为example.com的站点,并希望使用查询参数发送凭据,则完整的URL可能如下所示:
https://example.com/login?username=alice&password=12345)
example.com
解析为IP地址(124.21.12.31)
。在查询该信息时,仅使用特定于域的信息,即仅使用example.com
。124.21.12.31
连接服务器,并尝试连接到端口443(SSL服务端口,而不是默认的HTTP端口80)。example.com
上的服务器将向您的客户端发送其证书。因此,您不会暴露敏感数据。但是,使用这种方法通过HTTPS会话发送凭据并不是最佳方式。您应该选择另一种方法。
(例如http://example.com/login?username=alice&password=12345)
相矛盾。 - zaph是的。HTTPS会话的整个文本都由SSL进行安全保护,包括查询和标题。在这方面,POST和GET请求是完全相同的。
至于您的方法的安全性,没有适当的检查就无法真正地确定。
SSL首先连接到主机,因此主机名和端口号会以明文形式传输。当主机响应并成功挑战后,客户端将使用实际URL(即第三个斜杠后的任何内容)加密HTTP请求并发送到服务器。
有几种方法可以破坏这种安全性。
可能会配置代理作为“中间人”。基本上,浏览器将连接到真实服务器的请求发送到代理。如果代理以这种方式配置,则它将通过SSL连接到真实服务器,但浏览器仍将与代理通信。因此,如果攻击者能够访问代理,他可以查看所有流经代理的数据。
您的请求也将出现在浏览器历史记录中。用户可能会尝试将站点添加到书签。一些用户已安装了书签同步工具,因此密码可能最终出现在deli.ci.us或其他地方。
最后,某人可能已经黑掉了您的计算机并安装了键盘记录器或屏幕抓取程序(很多特洛伊木马病毒都这么做)。由于密码直接显示在屏幕上(而不是在密码对话框中的“*”),这是另一个安全漏洞。
结论:谈到安全性,始终依赖于已知的路线。因为有太多你不知道、不能想到,而这些会让你遭受损失。
是的,只要没有人在你的监视器旁边看着你。
是的,一旦您建立HTTPS连接,所有内容都是安全的。查询字符串(GET)和POST都通过SSL发送。
您可以将密码作为MD5哈希参数发送,并添加一些盐。在服务器端进行身份验证时进行比较。