我正在阅读 Web 服务的 API,所有方法都涉及发送 HTTP 请求到
https://example.com/api/APIVER/METHOD?apikey=APIKEY&user=USERNAME&password=PASSWORD
需要明确的是,API 密钥和用户密码都是通过 URL 以纯文本形式发送的。但这是否可以,因为“所有 HTTPS 流量都已加密”,还是因为它们仍然是纯文本或 URL 有所不同?
如果这不安全,那么 API 维护人员需要做的最小更改是多少?
我正在阅读 Web 服务的 API,所有方法都涉及发送 HTTP 请求到
https://example.com/api/APIVER/METHOD?apikey=APIKEY&user=USERNAME&password=PASSWORD
需要明确的是,API 密钥和用户密码都是通过 URL 以纯文本形式发送的。但这是否可以,因为“所有 HTTPS 流量都已加密”,还是因为它们仍然是纯文本或 URL 有所不同?
如果这不安全,那么 API 维护人员需要做的最小更改是多少?
是的,HTTPS 使这更安全。
HTTPS 使这更加安全。
您还应该将敏感参数作为 POST 参数而不是 GET 查询字符串参数(HTTP BODY)发送。通常,查询字符串将由 Web 服务器日志(服务器端)以纯文本形式记录,因此可能无法看到它的系统管理员可以访问它。
HTTPS 将对每个请求中的 URL 进行编码,所以如果您担心网络嗅探,那么您就可以了。HTTPS 还添加了一个 nonce 值,因此您不会受到回复攻击。
根据基础设施,插入用户设备信任的虚假 SSL 证书并使用该证书通过代理路由请求是可能的。但是,这将需要对客户端计算机的管理员/根访问权限以使此类证书受信任(除非违反通常受信任的 CA),并且一旦需要管理员访问权限,所有赌注无论如何都会关闭。
不过,这仍然不是一个好主意,我担心开发人员忘记为 HTTPS 配置它。您有一个 API 密钥,那么为什么不使用 APIKEY 作为盐来获取密码并对其进行哈希处理。现在对于 API 调用,盐是等效的密码,但这意味着用户名和密码不能用于使用这些凭据登录到其他地方,例如 API 正在运行的网站(假设您让用户登录当然在那里。)
更好的办法是使用根本不通过网络的共享秘密,并将其用作盐。