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

标签 javascript web-services security api

问题

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

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

  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 的脚本。该脚本现在将 ajax 请求发送到 mydomain.com?token=ABC&locationhost=badcustomer.com

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

最佳答案

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

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

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

关于javascript - 确保脚本仅包含在某些页面中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12462834/

相关文章:

java - 基于现有 WSDL 生成 Java Webservice 的工具

c# - 项目中不存在目标 "MSDeployTestConnection"

安卓.security.KeyStoreException : Invalid key blob

security - 如何让 LogonUser 不使用缓存的凭据?

javascript - 加载图像时在 AngularJS 中动态添加 ng-click

javascript - Firefox 3.5.x 中的 document.readyState

javascript - 整个数组的 IndexOf 和警报名称

javascript - 如何在 Angular 2 中填充 p-dataTable?

android - 如何将 HttpEntity 转换为 JSON?

java - 为什么 SSL 握手有时会杀死我的 CPU?