【问题标题】:secure rest API for running user "apps" in an iframe用于在 iframe 中运行用户“应用程序”的安全休息 API
【发布时间】:2010-04-04 01:03:39
【问题描述】:

我想让用户为我的网站创建“应用程序”(如 Facebook 应用程序),我正在尝试找出确保网站安全的最佳方法。

  1. 我有一个 REST api
  2. 我想在我自己的网站上的 iframe 中运行用户应用程序(不是像 FBML 这样的安全标记语言)

我最初是在查看 oAuth,但这对于我的解决方案来说似乎有点过头了。 “应用程序”不需要在外部站点或桌面应用程序或任何东西上运行。用户会一直停留在我的网站上,但会看到用户通过 iframe 提交“应用”。

因此,当我第一次通过 iframe 调用应用程序时,我可以向它传递一些变量,以便它知道哪个登录用户在我的网站上使用它。然后它可以在它自己的 API 调用中使用这个用户会话来自定义显示。

如果呼叫以明文方式传递,我不希望有人能够拦截会话并冒充用户。

有没有人知道这样做的好方法或写得好?谢谢!

【问题讨论】:

    标签: ruby-on-rails rest https security


    【解决方案1】:

    对于现代浏览器,使用 HTML 5 提供的跨窗口消息传递界面 https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

    对于较旧的浏览器,通过在与您的应用程序相同的域上创建第三个 IFrame,在第二个外部 IFrame 下方模拟上述消息传递界面。然后,您可以通过修改 URL 的片段部分来获得从第 2 到第 3 和从第 1 到第 2 的双向消息传递。第 3 和第 1 个 IFrame 可以在 javascript 中进行双向通信,因为您将它们托管在同一个域中。

    您应该能够将上述两种方法都包装到一个脚本中,并且也许可以获取这些消息传递层之一以节省一些时间: http://json-rpc.org/wiki/implementations

    【讨论】:

      【解决方案2】:

      如果您有 REST API,则不需要 iframe,事实上,iframe 在现代 Web 应用程序中被认为是非常糟糕的做法。如果您在外部站点上的内容不容易在客户端使用 javascript 或在服务器端使用您的应用程序进行操作,则 iframe 将很有用。此内容通常采用 HTML 文档的格式。

      您已经声明您有一个 REST API,因此您可以以任何您认为合适的方式操作资源返回的数据。例如,如果资源响应 JSON 或 XML 请求,您可以通过客户端(Web 浏览器)中的 Javascript 格式化和组织该数据,或者您可以使用 Web 框架从 REST API 收集数据并对其进行操作/组织,将结果提供给您的应用程序。

      为了保护在客户端和服务器之间来回传输的数据,您可以为服务中的每个用户提供 API 令牌(很多网站都这样做,例如 Github、Lighthouse 等)提供者并要求您的应用程序中的用户提供他们的 API 令牌。令牌可以在 HTTP 标头中传递给 REST 服务提供者,将令牌与请求和响应数据分开。对于此类流量,HTTPS (SSL) 是防止窃听的必要条件。

      如果这太笼统了,请告诉我,我可以举几个具体的例子。

      【讨论】:

      • 嘿帕特里克...感谢您的详细回答。关于 iframe,我不完全确定您的建议将如何发挥作用……只是为了澄清一下:我正在构建框架,我希望用户提交的应用程序可以在我的网站上使用(而不是在外部 url 上)。所以这意味着我要么必须(1)让用户上传他们自己的代码以在我的服务器上运行,这是一个安全风险(2)给他们某种沙盒“安全”语言来创建他们自己的页面,或者(3)他们在自己的网站上运行代码,它通过 iframe 出现在我的网站上。 Facebook 目前允许 #2 和 #3。这会改变你的答案吗?
      • 好的,我现在明白一点了。在这 3 个选项中,我绝对认为 2 和 3 的组合最接近于网络的移动方式(从进化的角度来看)。您的用户创建自己的应用程序并提供其应用程序提供的资源的 REST API。然后您提供沙盒 API 以允许您的用户聚合其他用户提供的服务。事实上,这与 Yahoo! 非常相似。管道pipes.yahoo.com/pipes,一个我没用过的应用程序,但我理解这个前提。我敢肯定还有其他这类事情的例子。
      猜你喜欢
      • 2019-01-29
      • 2015-04-23
      • 2013-08-22
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      相关资源
      最近更新 更多