【问题标题】:Secruing a API for Javascript Requests保护 Javascript 请求的 API
【发布时间】:2014-04-20 22:34:34
【问题描述】:

我即将为我的网络服务创建一个 API。现在是时候考虑安全性了。 将有多个客户端访问我的 API,但它们都是由我创建的,因此没有第三方客户端。 现在我计划了一个移动应用程序(Phonegap / JS)、一个网络应用程序(也是 JS)和一个 Chrome 应用程序(也是 JS)。

遗憾的是,我无法为我的 API 请求使用 HTTPS。这就是为什么我考虑 oAuth 1 的安全性。

我现在的问题:结合 JS 使用 oAuth 有多安全,因为 Secrets 将存储在客户端。

oAuth 是一个好的决定还是有人可以推荐一个替代方案?

非常感谢!

【问题讨论】:

  • 您的网站需要用户登录吗?如果是这样,通常的做法是在接受 Ajax 请求之前要求用户登录 cookie,如果有人试图滥用您的 Ajax API,您至少可以删除该用户帐户,这样他们就不能继续滥用它(直到他们手动创建一个新帐户并重新开始,但至少您对 API 的用户有一些控制和可跟踪性)。
  • 许多其他 API 需要 APIKey。为自己在网页中使用,可以在页面中嵌入APIKey。虽然有人当然可以将其从网页中捞出并用于自己的用途,但如果您发现它被滥用,您只需将不同的 APIKey 放入您的网页并阻止之前使用的 APIKey。您甚至可以每天自动轮换您的 APIKey,这样任何人都无法在不定期刷新 APIKey 的情况下编写使用您 API 的长时间运行的应用程序。

标签: javascript api security oauth


【解决方案1】:

对不起,我有坏消息要告诉你。

oAuth 根本不安全。您需要使用 SSL。确保安全的唯一方法是让 Web 浏览器供应商信任的第三方提供签名证书,以证明您就是您声称的身份。否则,与用户在同一 LAN 上的任何人都可以轻松侵入您的系统。

另请注意,oAuth 2.0 实际上无论如何都需要 SSL 连接。

最后还有一些坏消息,你不能在客户端存储任何秘密。客户端由使用您的应用程序的任何人控制,他们可以访问您存储在那里的所有秘密。无法更改,SSL 也无济于事。

要点是:

  • 您需要使用 SSL,别无选择。
  • 不得在客户端存储任何机密。所有机密都必须在服务器端。

【讨论】:

  • 您似乎还没有描述将随机代理排除在其 API 之外的解决方案,因此现在说需要 SSL 还为时过早。如果数据本身不需要确定,那么我认为需要在特定解决方案的上下文中评估对 SSL 的需求,以将随机代理排除在其 API 之外。
  • @jfriend00 我没有描述将随机代理排除在外的解决方案,因为没有这样的解决方案。这是不可能的目标。您必须存储秘密客户端才能实现它,并且您不能存储秘密客户端。所有用户都可以访问该密钥,并且所有用户都可以与全世界共享该密钥。
  • 是的,我知道所以我不明白你在说什么需要 SSL。仅当您需要保护传输中的实际数据或保护机密时才需要 SSL。如果没有使用登录密码(因为您不能从浏览器客户端)并且数据不必受到保护,为什么 Ajax 请求需要 SSL?
  • 感谢您到目前为止的回答。是的,我需要我的用户登录。数据不一定是安全的。但是例如谷歌(即驱动器)是如何做到这一点的?据我所知,他们正在使用 oAuth,并且有一个移动应用程序、一个浏览器和一个 Chrome 应用程序。所以它必须以某种方式工作?!
  • @jfriend00 SSL 不只是做加密,它还证明你正在与之交谈的服务器就是你期望与之交谈的服务器,并且没有人在进行中间人攻击。这是 SSL 中花钱的部分,也是最重要的部分。
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 2015-02-03
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2014-08-27
相关资源
最近更新 更多