仅允许 specific/official HTML5 Web 应用程序连接到 Websocket 主机

Allow only specific/official HTML5 Web Apps to connect to a Websocket host

是否可以确保只能通过 "official" (HTML5) 应用建立网络套接字连接(通过 socket.io)?

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

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

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

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

感谢您的回复!

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

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

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

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

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

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


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


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


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


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


而且,如果您发现来自特定来源的重复滥用行为,您也可以阻止您的服务的 IP 范围(冒着意外阻止一些合法用户的风险)。