我想创建一个Javascript小部件,我的用户可以将其放到他们的网站上。
该小部件能够创建音频,这反过来又要花我的用户钱。

为了说明起见,假设每当互联网上的任何人(即我的用户的用户)加载放置在我的用户站点上的小部件时,我都向我的用户收取$ 1的费用。

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

图解:

javascript - 从JavaScript到后端的API调用:在没有服务器端代码的情况下确保合法性-LMLPHP

我担心的是不是我的用户的人的恶意使用。
假设某人获取了他们在属于我的一个用户的网站上找到的小部件的源代码,然后将其放置在自己的网站上。因此,他们将使用我的服务,但不付款。相反,我的实际用户会为此付费(假设我使用公共API密钥作为区分用户的一种方式)。

通常,可以通过让服务器端库负责可能会花费金钱的任何使用来避免这种情况。例如,我将Pusher用作WebSockets IaaS,每当我要发布消息时,就必须在服务器端使用它们的PHP SDK,同时使用私有和公共API密钥。

在我的用例中,必须没有服务器端库。

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

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

我了解这可能无法实现。

最佳答案

您的要求似乎与客户端加密主题密切相关。在大多数情况下,答案是“否”,这是不可能的。但是,在这种情况下,可以按照以下方式实现某些功能。如果您可以让客户安装一个插件(您将要构建),则可以在完成JS代码后对其进行加密,并让服务器提供该加密文件。通常,这不足之处在于,如果您要发送加密文件,则客户端需要一种方法对其进行解密。这将需要您还提供一个未加密的JS文件来进行解码,但是通过提供未加密的解码器,您将无法消除通过加密主JS文件而获得的任何安全性(解密文件可以很容易地用于对加密方法进行反向工程/为您的目标用户以外的其他人直奔广告)。现在,在这里方便使用那些API用户(以及通过服务器-客户端连接之外的方式与他们通信的功能)。如果您构建一个解密插件并将其提供给API用户(您可以为每个用户发布一个唯一的解密密钥,但是如果没有服务器访问权限,则实现唯一的用户密钥将非常困难/不可能),然后该插件可以解密您提供的文件在他们的浏览器中,从根本上保证了只有您提供“密钥”的用户才能访问您的软件。但是,此方法有一些警告。这意味着您对用户足够信任,以至于他们不会分发该插件(无论如何分发它们都是他们的意图,因为如果有人假冒他们可能会导致更高的费用)。这种方法可能还存在其他一些安全问题,但是,我现在无法想到它们。如果有任何想法,我将对此帖子进行编辑并添加它们。

07-24 19:17
查看更多