【问题标题】:ensuring that a script is only included into certain pages确保脚本仅包含在某些页面中
【发布时间】:2012-09-17 15:50:18
【问题描述】:

问题

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

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

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

这行得通吗?

为什么我不能使用 window.location

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

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

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

【问题讨论】:

  • 如果一开始刷脚本的人也抓取了文本文件,那它就行不通了。显然他们必须知道文件在那里,但如果你能得到它,其他人也可以根据客户在你的服务中提供的域列表检查发送令牌的请求的来源..??尽管您必须检查某人是否伪造了请求的来源
  • 我想你误解了我所说的令牌的意思。客户端的服务器没有发送令牌。令牌将只是我的脚本请求中的一个参数,其方式类似于分析跟踪代码。我希望任何使用静态网站的人都能使用我的服务,所以我不能要求他们从他们的服务器向我的服务器发送请求。
  • 当然,因此您可以根据您为该 ID 持有的域列表验证该 ID。不是吗?无论哪种方式,您都需要知道他们的域名。

标签: javascript web-services security api


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 服务器应该能够知道请求来自哪里,而不需要客户端的任何额外工作。但这里的理论是成立的。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2013-12-11
    • 2010-10-03
    • 2016-09-18
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多