如何为用户提供一个javascript小部件,以便从我的网站安全地提取内容

时间:2010-02-16 16:27:45

标签: javascript html widget xss

我需要允许来自我们网站的内容嵌入其他用户网站。 该conent将收费,所以我需要保持安全,但其中一个要求是订阅网站只需要将一些javascript放入他们的页面。

看起来保护我们内容的唯一方法是检查托管我们的javascript的页面的网址与订阅网站的匹配。有没有其他方法可以做到这一点,因为我们不知道将访问订阅网站的客户端浏览器?

最好的方法是在页面加载时提供填充已知页面元素的javascript包含文件吗?我正在考虑使用jquery,因此include文件首先调用jquery(检查它是否已经加载并使用某种命名空间保护),然后在页面加载时填充给定的元素。

如果可能的话,我还要包含样式表来设置元素的样式,但我不确定是否可以将其与javascript一起加载。

这听起来像是一种合理的做法吗?还有什么我应该考虑的吗?

提前致谢,

麦克

2 个答案:

答案 0 :(得分:5)

  

看起来保护我们内容的唯一方法是检查托管我们的javascript的网页的网址与订阅网站的匹配。

啊,但是在客户端或服务器端代码?

他们都有自己的缺点。使用服务器端代码执行此操作是不可靠的,因为某些浏览器根本不会传递Referer标头,并且如果要阻止缓存保留脚本的副本,则阻止进行Referer检查,你必须使用nocache或Vary: Referer标题,这会损害性能。

另一方面,通过返回的脚本中的客户端检查,您无法确定您正在运行的环境是否已被破坏。例如,如果您的包含脚本标记如下:

<script src="http://include.example.com/includescript?myid=123"></script>

并且您的服务器端脚本查找123作为使用域customersite.foo的客户的ID,它可能会回复脚本:

if (location.host.slice(-16)==='customersite.foo') {
    // main body of script
} else {
    alert('Sorry, this site is not licensed to include content from example.com');
}

这似乎很简单,但包含网站可能已将String.prototype.slice替换为始终返回customersite.foo的函数。或者脚本正文中使用的各种其他函数可能是可疑的。

包含来自其他安全上下文的<script>会削减两种方式:包含站点必须信任源站点,不要在其安全上下文中执行任何不良操作,例如窃取最终用户密码或将页面替换为大山羊;但同样地,源站点的代码只是包含站点的潜在恶意定制的安全上下文中的访客。因此,无论一个站点包含来自另一个站点的脚本,双方之间必须存在一定程度的信任;域检查永远不会是一个100%万无一失的安全机制。

  

如果可能的话,我还要包含样式表来设置元素的样式,但我不确定是否可以将其与javascript一起加载。

您当然可以将样式表元素添加到文档的head元素中,但是您需要一些强大的命名空间以确保它不会干扰其他页面样式。您可能更喜欢使用内联样式来简化并避免页面主样式表中的特殊性干扰。

这取决于您是否希望生成的内容成为主页的一部分(在这种情况下,您可能更愿意让包含网站处理他们自己想要的样式),或者您是否希望它独立存在,不受上下文的影响(在这种情况下,您可能最好将内容放在<iframe>中,并使用自己的样式。

  

我正在考虑使用jquery,因此include文件首先会在jquery中调用

我会尽量避免将jQuery拉入主页。即使使用noconflict,也有可能与其他不期望它存在的脚本发生冲突,尤其是像其他框架一样复杂的脚本。在同一页面上运行两个框架是导致奇怪错误的方法。

(另一方面,如果你采用<iframe>路线,你可以获得自己的脚本上下文,所以那里不会有问题。)

答案 1 :(得分:2)

您可以存储用户域以及本地数据库中的密钥。那个,或者密钥可以是域的加密版本,以防止您不必进行数据库查找。其中任何一个都可以确定您是否应该响应请求。

如果请求有效,您可以将数据发回给用户。这些数据确实可以加载到jQuery和其他CSS引用中。

相关:

  1. How to load up CSS files using Javascript?
  2. check if jquery has been loaded, then load it if false