使用明文密码访问 REST API 的最佳实践

Posted

技术标签:

【中文标题】使用明文密码访问 REST API 的最佳实践【英文标题】:Best Practice for accessing REST API with plaintext password 【发布时间】:2015-03-12 05:42:42 【问题描述】:

我正在构建的应用程序使用 AJAX 连接到 REST Web 服务。此服务不需要 API 密钥,而是需要纯文本用户名和密码作为 POST 数据与身份验证请求一起传输。除了这种糟糕的设计之外,用户/通行证组合是用于访问与服务相关联的网站的相同凭据,这使得它们特别敏感。该服务确实使用 SSL,但用户/通行证仍以纯文本形式出现在 javascript 源代码中。既然最明显的答案“不要使用具有如此明显安全漏洞的服务”对我来说不是一个选项,那么是否有任何巧妙的解决方案来保护用户名和密码?

这个应用程序经常向 API 发出请求以处理实时数据,因此我试图避免在我自己的服务器上使用代理,这基本上会使我的开销翻倍。这让我希望有某种客户端解决方案。

我将部署会限制可读性的缩小代码,但这很容易反转,它不会混淆纯文本值,所以我希望有更强大的东西。

我正在使用 jQuery,我的请求非常典型。

$.ajax(
    type: "POST",
    url: "https://my.insecurewebservice.com/api/",
    data: JSON.stringify(
        "username": "me@mymail.com",
        "password": "plaintextpassword"
    ),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(response, status, request) 
        // perform the usual work here
    
);

【问题讨论】:

如果可能,请联系您的网络服务提供商并进行讨论。 【参考方案1】:

在那种 API 模型中无法保护此类数据。在某些时候,浏览器中的 JS 需要使用这些凭据进行 AJAX 调用,并且无论您在那之前做了什么(缩小、加密等),都必须撤消它才能传输服务器的密码。那是默默无闻的安全,它根本不是安全。

您的选择是:

让提供商更改其 API 在他们的网络会话期间提示用户输入密码(听起来这不是一个选项) 通过您自己的中间 Web 服务代理这些请求

听起来,代理选项是您最好的选择。这并不全是坏事,因为您也许可以在该层中进行一些缓存或其他优化。

【讨论】:

以上是关于使用明文密码访问 REST API 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在鼓励使用特殊字符的密码等字段的 REST API 中,避免 WAF 误报的最佳编码实践是啥

访问自己/自己的对象的 REST API 最佳实践

保护REST API/Web服务的最佳实践

自定义 REST 服务的 API 身份验证最佳实践

有限 REST API 的最佳实践

使用 Express 和 NodeJS 构建 REST API 的最佳实践