【问题标题】:Allow only specific/official HTML5 Web Apps to connect to a Websocket host仅允许特定/官方 HTML5 Web 应用程序连接到 Websocket 主机
【发布时间】:2015-04-27 14:06:13
【问题描述】:

是否可以确保只能通过“官方”(HTML5) 应用程序建立 Web 套接字连接(通过 socket.io)?

目标是,知道 API 的第三方应用程序在没有进一步授权信息的情况下无法连接到主机。

在我看来,困难在于在网络应用程序中放置一个秘密,以便应用程序可以使用它来授权为“官方”。

这个要求有点难以实现,因为 javascript 内容始终是可读的,无论您是否在代码上应用了晦涩的方法。

是否有任何概念/插件/库等以所述方式对冲 API?

感谢您的回复!

【问题讨论】:

    标签: html api websocket socket.io authorization


    【解决方案1】:

    由于在浏览器中运行的代码的开放性,实际上没有办法直接执行此操作。您可以要求 APIkey 或类似的东西,但如果您在浏览器中使用这些 APIkey,则它们不是秘密,因此任何人都可以从自己的应用中发现并使用它们。

    网站处理此问题的最常见方式是要求在您的 websocket 连接上进行用户身份验证(通常可以利用可能已经通过已经存在的 cookie 完成的网页用户身份验证)。这显然需要用户在您的服务上拥有一个帐户并登录该帐户。然后,如果您发现某个特定连接被滥用,您可以禁止该用户的凭据进入该服务。

    这并不能阻止某人设置使用他们自己的凭据来使用您的 API 的流氓服务器进程,但是如果您检测到潜在的滥用,那么您至少有一种机制可以将它们锁定(至少是暂时的,直到他们做出一个新帐户)。


    您还可以确保您的服务不接受跨域请求。这可以防止其他基于浏览器的应用程序直接从浏览器使用您的 API。它不会阻止脚本(在浏览器外部或服务器上运行)使用您的 API。


    您可以创建服务条款,允许您禁止任何与您的条款不一致的访问。如果需要,这实际上只是一个法律支持,但不能防止有目的的滥用。


    您可以在 API 中内置一些异常使用模式检测功能(例如有人试图从您的站点收集所有数据),而这些检测通常不会被您的常规客户端应用程序尝试。然后,这可能导致一个帐户被标记,人们可能会进一步调查并决定是通知还是禁止该帐户。许多服务(如 Google 服务)在网站中内置了速率限制,以防止一个特定连接使用超过公平份额的服务器资源。该路径更多的是服务器保护或负载保护策略,而不是防止未经授权的使用功能。


    我看到的另一种技术是一种威慑,但我自己并没有实际使用过,它是将一个不断变化的代码嵌入到每个使用你的 API 的合法网站页面中,并要求该代码与所有 API 请求一起发送.这可以防止在没有首先发出网页请求来获取代码的情况下完全独立使用 API。如果代码本身不是直接嵌入到页面中,而是使用一些基于网页中嵌入的其他内容的 Javascript 计算出来的,那么它使服务器进程从网页中抓取代码的工作量更大要求。然后,不断变化的代码具有一定的生命周期,您的服务器可以知道它何时过期。这不是真正的安全性,因为有进取心的开发人员可以通过发出正常的 Web 请求来解决它,获取所需的令牌,然后计算不断变化的代码的当前版本,并定期执行此操作以使他们的代码保持最新。但是,它确实可以发挥足够的作用,从而对尝试使用您的 API 的更随意的黑客起到威慑作用。


    而且,如果您看到来自特定来源的重复滥用行为,您还可以阻止您的服务的 IP 范围(也可能会意外阻止某些合法用户)。

    【讨论】:

      【解决方案2】:

      从概念上讲,这样的事情是不可能的。您需要将连接到 API 所需的所有内容发送到客户端;意味着所有客户端代码都是完全公开的。* 由于连接所需的所有详细信息都是公开的,因此您无法放置任何可以区分“官方”和“非官方”客户端的秘密。此外,客户什么时候不再是“官方的”?如果用户在浏览器的 Javascript 控制台中放置一个断点并稍微改变一些代码怎么办?这与从头开始编写符合标准的“非官方”客户端有何不同?

      您的安全需要在 API 本身中,它需要检查客户端是否被允许执行特定操作。尝试将您的安全性建立在确认客户端的真实性上肯定会失败。

      * 好吧,除非您不公开您的代码并且在下载之前要求进行身份验证。然后,您理论上可以将代码与一些特定于客户端的令牌交织并预编译。但这听起来麻烦多于其价值,并且仍然不能真正保护您免受更改客户的侵害。

      【讨论】:

        猜你喜欢
        • 2017-04-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多