是否可以确保建立一个Web套接字连接(通过socket.io)只能来自官方" (HTML5)app?
目标是,在没有进一步授权信息的情况下,具有API知识的第三方应用无法连接到主机。
在我看来,困难在于在网络应用中放置一个秘密,以便应用可以使用它来授权为#34;官方"。
这个要求很难实现,因为javascript内容总是可读的,无论你是否在代码上应用了晦涩的方法。
是否有任何概念/插件/库等以上述方式对API进行对冲?
感谢您的回复!
答案 0 :(得分:0)
从概念上讲,这样的事情是不可能的。您需要将连接到API所需的所有内容发送到客户端;这意味着所有的客户代码都是完全公开的。*有了连接公开所需的所有细节,你无处可以放置任何可以区分“官方”和“非官方”客户的秘密。此外,客户什么时候停止“正式”?如果用户在浏览器的Javascript控制台中放置一个断点并稍微改变一些代码怎么办?与从头开始编写一个符合标准的“非官方”客户有何不同?
您的安全性需要在API本身,这需要检查是否允许客户端执行特定操作。尝试以确认客户端的真实性为基础的安全性必然会失败。
*嗯,除非你没有公开你的代码并且在下载之前需要进行身份验证。那么理论上你可以用一些特定于客户端的令牌交织和预编译代码。但这听起来比它的价值更麻烦,但仍然无法真正保护你免受改变客户的侵害。
答案 1 :(得分:0)
由于在浏览器中运行的代码的开放性,实际上没有办法直接执行此操作。您可以要求APIkeys或其他类似的东西,但如果您从浏览器中使用这些API密钥,它们就不是秘密,所以任何人都可以发现它们并在自己的应用程序中使用它们。
网站处理此问题的最常见方式是要求在您的websocket连接上进行用户身份验证(通常可以利用可能已经通过已存在的cookie完成的网页用户身份验证)。这显然要求用户在您的服务上拥有一个帐户并登录该帐户。然后,如果您发现滥用特定连接,则可以从服务中禁止该用户的凭据。
这并不妨碍某人设置使用自己的凭据来使用您的API的流氓服务器进程,但如果您发现可能的滥用行为,那么您至少有一种机制可以将其锁定(至少暂时将其锁定一个新帐户。)
您还可以确保您的服务不接受跨源请求。这可以防止其他基于浏览器的应用程序直接从浏览器使用您的API。它不会阻止脚本(在浏览器外或在服务器上运行)使用您的API。
您可以创建服务条款,禁止任何与您的条款不一致的访问权限。如果需要,这实际上只是一个合法的支持,但不能防止有目的的滥用。
您可以在API中构建一些异常使用模式的检测(例如,有人试图从您的网站获取所有数据),而这些模式通常不会被您的常规客户端应用程序尝试。这可能导致一个帐户被标记为人可能会进一步调查,并决定是否通知或禁止该帐户。许多服务(如Google服务)都在网站内置了速率限制,以防止某个特定连接使用超过公平份额的服务器资源。该路径更多的是服务器保护或负载保护策略,而不是防止未经授权的使用功能。
我所看到的另一种技术是威慑,但实际上并未使用我自己就是将一个不断变化的代码嵌入到使用您的API的每个合法网站页面中,并要求将代码与所有人一起发送API请求。这可以防止API在没有首先发出网页请求来获取代码的情况下完全使用它。如果代码本身没有直接嵌入到页面中,而是基于网页中嵌入的一些其他东西来计算一些Javascript,那么它使得服务器进程从网页中删除代码变得更加有效。请求。然后,不断变换的代码有一些生命周期,服务器可以告诉它何时到期。这不是真正的安全性,因为有进取心的开发人员可以通过发出正常的Web请求来处理它,获取所需的令牌然后计算不断变化的代码的当前版本并定期执行以保持其代码是最新的。但是,它确实足以让那些试图使用你的API的休闲黑客受到威慑。
而且,如果您发现来自特定来源的重复滥用行为,您还可以阻止来自您服务的IP范围(也可能会意外阻止某些合法用户)。