我正在构建的应用程序使用 AJAX 连接到 REST Web 服务。该服务不需要 API key ,而是需要将纯文本用户名和密码作为 POST 数据与身份验证请求一起传输。除了这种糟糕的设计之外,用户/通行证组合与用于访问与服务相关的网站的凭据相同,这使得它们特别敏感。该服务确实使用了 SSL,但用户/密码仍然以纯文本形式出现在 JavaScript 源中。由于最明显的答案“不要使用具有如此明显的安全漏洞的服务”对我来说不是一个选择,是否有任何聪明的解决方案来保护用户名和密码?
此应用程序频繁请求 API 来处理实时数据,因此我试图避免在我自己的服务器上使用代理,这基本上会使我的开销增加一倍。这让我希望有某种客户端解决方案。
我将部署缩小的代码,这会限制可读性,但这很容易逆转,并且它不会混淆纯文本值,因此我希望有更强大的东西。
我正在使用 jQuery,我的请求非常典型。
$.ajax({
type: "POST",
url: "https://my.insecurewebservice.com/api/",
data: JSON.stringify({
"username": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2b464e6b4652464a424705484446" rel="noreferrer noopener nofollow">[email protected]</a>",
"password": "plaintextpassword"
}),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(response, status, request) {
// perform the usual work here
}
});
最佳答案
在这种 API 模型中无法保护此类数据。在某些时候,浏览器中的 JS 需要使用这些凭据进行 AJAX 调用,并且无论您在此之前做了什么(缩小、加密等),都必须撤消该操作才能传输服务器的密码。这是默默无闻的安全,而且根本不是安全。
您的选择是:
- 让提供商更改其 API
- 提示用户在网络 session 期间输入密码(听起来这不是一个选项)
- 通过您自己的中间网络服务代理这些请求
听起来,代理选项是您最好的选择。这并不全是坏事,因为您也许可以在该层中进行一些缓存或其他优化。
关于security - 使用明文密码访问 REST API 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27936187/