2

问题

我有一项向用户推送内容的服务。为了向他们的用户提供这些内容,客户将在他们的网站上包含一个脚本。他们的脚本向我的服务器发送一个令牌以识别它是哪个客户,但问题是:如果有人从用户的站点复制脚本,他们可以接收此实时内容,并且客户需要为不在其站点上的用户付费. 那么,有没有办法确保脚本只包含在他们的网站上?谷歌分析是如何做到这一点的?

我有一个想法,但我不知道这是否完全安全。

  1. 客户告诉我他们想在其中包含我的脚本的任何域(包括子域)。
  2. 我给用户一个非常小的文本文件,他们存储在他们的服务器上。
  3. 加载我的脚本后,它会检查 window.location.host,并尝试从托管域的根目录中获取文本文件。
  4. 如果找到文件,并且内容与我给客户文件时生成的内容相匹配,我将激活服务。

这行得通吗?

为什么我不能使用 window.location

假设我的脚本读取 window.location,并将其发送到 urlmydomain.com?token=ABC&locationhost=goodcustomer.com

现在 baduser.com 的所有者想要滥用 gooduser.com 的帐户,所以他包含了 gooduser.com 的脚本。该脚本现在发送一个 ajax 请求到mydomain.com?token=ABC&locationhost=badcustomer.com

这不会启动服务,因为 badservice.com 不是 goodcustomer.com 的所有者在注册时输入的域。这很容易绕过,因为 badcustomer.com 的所有者可以查看我的脚本,注意到它正在发送验证 url 的请求,然后发送他自己的请求。所以他会向 发送请求mydomain.com?token=ABC&locationhost=goodcustomer.com。我的服务器看到此请求,将 locationhost 与与令牌关联的域进行比较,并开始将针对 goodcustomer.com 的用户的内容提供给 badcustomer.com 的用户。我的服务器无法知道请求是由我自己的脚本发送的,还是由试图冒充实际客户的用户发送的。

4

2 回答 2

1

您不能仅使用在最终用户浏览器中运行的脚本来为此提供安全的解决方案。想要模仿您的客户网站的人总是能够通过创建您发送到浏览器的每个脚本或文件的副本来做到这一点。您将需要在您的客户服务器上做一些事情。也就是说,您的客户必须拥有某种未发送到浏览器的秘密。

一种方法是为客户提供一个生成一次性令牌的服务器端脚本。让您的脚本调用此服务器端脚本以获取令牌并将此令牌包含在对您的服务器的请求中。您的服务器必须在生成数据之前检查令牌是否正确。

可以通过向每位客户发送一个 20 个字符长的密码来制作一次性令牌。让服务器端脚本读取密码,添加日期和时间并使用 SHA-256 对这个值进行散列。如果您不知道密码,则很难创建虚假令牌。如果在服务器端脚本中添加一个计数器会更好。让计数器为每个请求增加一个。但是,如果您站点上的计数器与客户站点上的计数器不同步,计数器会引入一些同步问题。

于 2012-09-17T16:08:43.810 回答
1

您可以建立一个用户将托管脚本的域的数据库,然后当用户加载脚本时,它将发送window.location到您的服务器,然后如果窗口位置与数据库中的位置匹配,您的服务器将发送内容。

于 2012-09-17T16:02:50.267 回答