从JavaScript到后端的API调用:确保没有服务器端代码的合法性

时间:2017-08-09 01:51:57

标签: javascript api security widget

我想创建一个我的用户可以放在他们网站上的Javascript小部件。 小部件能够创建音频,反过来又会花费用户的钱。

为了便于说明,我们假设每次放置在我的用户网站上的小部件都被互联网上的任何人(即我的用户的用户)加载时,我向用户收取1美元的费用。

小部件是围绕HTML音频播放器的Javascript代码。每次加载时,JS代码都会向我的后端API发出请求,并且在收到来自我的后端API的响应后,构建了播放器。

图:

diagram

我关注的是非我用户的恶意使用。 假设某人使用他们在属于我的某个用户的网站上找到的小部件源代码,并将其放在他们的网站上。因此,他们将使用我的服务但不支付费用。相反,我的实际用户将为此付费(假设我使用公共API密钥作为区分我的用户的方式)。

通常,通过让服务器端库负责可能花钱的任何用法来防止这种情况。例如,我使用Pusher作为我的WebSockets IaaS,每当我想发布消息时,我都必须在服务器端使用他们的PHP SDK,使用私有和公共API密钥。

在我的用例中,强制要求不要有服务器端库。

问题:如何确保我收到的API请求合法?

我考虑使用放置小部件的主机名作为合法性度量。在窗口小部件设置期间,我可以要求我的用户将某些(子)域列入白名单并拒绝所有不符合条件的请求,但这可能很容易受到例如自定义本地域或CURL-的欺骗 - 制作请求。

我知道这可能是不可能的。

3 个答案:

答案 0 :(得分:1)

您的问题似乎与客户端加密主题密切相关。在大多数情况下,答案是否定的,这是不可能的。然而,在这种情况下,可以沿着以下方式实现某些内容。如果您可以让您的客户安装一个插件(您将构建它),您可以在完成后加密您的JS代码,并让您的服务器提供此加密文件。通常情况下,如果您不能发送加密文件,那么客户端需要有一种方法来解密它。这将要求您还提供一个未加密的JS文件来进行解码,但是通过提供未加密的解码器,您可以撤消通过加密主JS文件获得的任何安全性(解密文件可以很容易地用于反向工程加密方法/只是直接运行除预期用户以外的人员)。现在,拥有这些API用户(以及通过服务器 - 客户端连接之外的方式与他们通信的能力)就派上用场了。如果您构建一个解密插件,并将其提供给API用户(您可以为每个用户发出唯一的解密密钥,但没有服务器访问实现唯一的用户密钥将非常困难/不可能),插件可以解密您提供的文件在他们的浏览器中,基本上保证只有用户才能给出关键字'可以访问您的软件。但是,这种方法有一些注意事项。这意味着你足够信任你的用户,以至于他们不会分发这个插件(无论如何都要反对他们的利益,因为如果人们冒充他们就会导致更高的充电器)。这种方法可能还有其他几个安全问题,但是,我现在无法想到它们。如果有任何想法,我将编辑此帖并添加它们。

答案 1 :(得分:1)

显然,我还没有足够的声誉发表评论,因此帖子...... 但是在回复你的帖子时,我认为这种方法似乎比我建议的方法要好得多;我没有意识到你可以控制API对服务器的响应。

我不太明白你的意思是:

a)向用户发送一个JS文件,其唯一目的是确定是否也应该发送播放器(即在到达时,它使用客户端的API密钥/ URL ping服务器)和然后服务器将为文件提供服务(在这种情况下,您的方法对我来说似乎是安全的,但其他人可能会发现安全问题)。

b)使用JS 发送一个文件,该文件在到达时确定URL和API密钥是否正确,然后允许音频播放器正常运行(发送API)服务器跟踪使用情况的关键,而不是安全功能)。

如果使用选项b,则不会提高安全性。如果您的代码依赖于在客户端运行的安全性,并且安全系统是通过与代码相同的方式发送的,那么几乎毫无例外地,所设计的系统存在缺陷并且本质上不安全。

我希望这会有所帮助,如果您不同意/有更多问题,请随时发表评论!

答案 2 :(得分:0)

如何将以下参数从JavaScript小部件发送到API后端:

  • 公共API密钥(例如bbbe3b259f881cfc796f468619eb9d
  • 当前网址(例如https://example.com/articles/chiang-mai-thailand-january-2016-june-2016

我将使用API​​密钥作为区分 my 用户和当前URL的方式,以此来了解要创建哪个音频文件(我的小部件将根据URL创建音频文件)

此外,这是至关重要的,我将让用户在我的中心网站上将其域和子域列入白名单,我的用户将在其中获取其小部件代码。

这与FB对其集成的作用相同: enter image description here

因此,例如,如果我的后端API收到上述示例网址,并且用户已将小部件设置为仅允许属于foo.combar.baz.com的网址,我将拒绝创建音频处理并显示错误。

您认为此方法存在任何问题吗?