【发布时间】:2012-09-17 15:50:18
【问题描述】:
问题
我有一项向用户推送内容的服务。为了向他们的用户提供这些内容,客户将在他们的网站上包含一个脚本。他们的脚本向我的服务器发送一个令牌以识别它是哪个客户,但问题是:如果有人从用户的站点复制脚本,他们可以接收此实时内容,并且客户需要为不在其站点上的用户付费.那么,有没有办法确保脚本只包含在他们的网站上?谷歌分析是如何做到这一点的?
我有一个想法,但我不知道这是否完全安全。
- 客户告诉我他们希望在其中包含我的脚本的任何域(包括子域)。
- 我给用户一个非常小的文本文件,他们存储在他们的服务器上。
- 加载我的脚本后,它会检查 window.location.host,并尝试从托管域的根目录中获取文本文件。
- 如果找到文件,并且内容与我给客户文件时生成的内容匹配,我将激活服务。
这行得通吗?
为什么我不能使用 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