确保脚本仅包含在某些页面中

时间:2012-09-17 15:50:19

标签: javascript web-services security api

问题

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

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

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

    为什么我不能使用window.location

    假设我的脚本读取window.location,并将其发送到网址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与与令牌关联的域进行比较,并开始向badcustomer.com的用户提供适用于goodcustomer.com用户的内容。我的服务器无法知道我自己的脚本或试图模仿实际客户的用户发送了请求。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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