我如何给用户一个javascript小部件来安全地从我的站点中提取内容

我如何给用户一个javascript小部件来安全地从我的站点中提取内容,javascript,html,widget,xss,Javascript,Html,Widget,Xss,我需要允许从我们的网站内容被嵌入到其他用户的网站。 conent是收费的,所以我需要保证它的安全性,但其中一个要求是订阅网站只需要在他们的页面中添加一些javascript 看起来保护我们内容的唯一方法是检查承载javascript的页面的url是否与订阅站点匹配。考虑到我们不知道哪些客户端浏览器将访问订阅站点,有没有其他方法可以做到这一点 最好的方法是提供一个javascript包含文件,在页面加载时填充已知的页面元素吗?我正在考虑使用jquery,这样include文件将首先调用jquery

我需要允许从我们的网站内容被嵌入到其他用户的网站。 conent是收费的,所以我需要保证它的安全性,但其中一个要求是订阅网站只需要在他们的页面中添加一些javascript

看起来保护我们内容的唯一方法是检查承载javascript的页面的url是否与订阅站点匹配。考虑到我们不知道哪些客户端浏览器将访问订阅站点,有没有其他方法可以做到这一点

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

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

这听起来合理吗?还有什么我需要考虑的吗?< 提前感谢,


Mike

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

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

相关:

  • 看起来保护我们内容的唯一方法是检查承载javascript的页面的url是否与订阅站点匹配

    啊,但是在客户端还是服务器端代码中

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

    另一方面,如果在返回的脚本中进行客户端检查,则无法确保正在运行的环境没有受到破坏。例如,如果包含脚本标记类似于:

    <script src="http://include.example.com/includescript?myid=123"></script>
    
    这似乎很简单,只是包含的站点可能已经用一个总是返回
    customersite.foo
    的函数替换了
    String.prototype.slice
    。或者脚本主体中使用的各种其他函数可能是可疑的

    包含来自另一个安全上下文的
    具有双重意义:包含的站点必须信任源站点不会在其安全上下文中做任何坏事,例如窃取最终用户密码或用大goatse替换页面;但同样,源站点的代码只是包含站点潜在恶意定制的安全上下文中的来宾。因此,当一个站点包含来自另一个站点的脚本时,双方之间必须存在一定程度的信任;域检查永远不会是100%万无一失的安全机制

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

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

    这实际上取决于您是否希望生成的内容成为主机页的一部分(在这种情况下,您可能更愿意让include站点自己处理它们想要的样式),或者您是否希望它独立,不受上下文的影响(在这种情况下,您最好将内容放在一个具有自己风格的
    中)

    我正在考虑使用jquery,以便include文件首先调用jquery

    我会尽量避免将jQuery拖入主机页。即使使用
    noconflict
    ,它也会与其他不希望它出现的脚本发生冲突,特别是像其他框架一样的复杂脚本。在同一页上运行两个框架会导致奇怪的错误


    (另一方面,如果您选择了
    路线,那么您就可以使用自己的脚本上下文,这样就不会有问题了。)

    +1欢迎使用Stack Overflow,Mike!谢谢Jonathan,我在网站+1上找到了一些很棒的技巧。顺便说一句,我在从第三方网站将脚本加载到我的页面时会非常小心,尤其是当它还没有结束时,https。除了不想让第三方访问我页面的DOM之外,它还为potenti打开了大门al MITM攻击。大多数小部件提供商都应该使用iframes为所有相关方提供安全性。iframes可以是透明的,您甚至可以提供一个
    get
    参数来提供css文件的位置。感谢您提供的信息,这给了我很多思考和澄清的东西。@bobince有可能e包括替换“location.host”函数和“String.slice”的站点?@Murat:是的,尽管在使用
    location
    的具体操作上存在一些浏览器的怪癖。在IE中,您可以替换整个
    location
    对象。在Firefox中,您可以
    object。定义属性
    现有
    location
    对象上的替换属性。@bobince这意味着无法提供100%安全的小部件,因为它可能会丢失/欺骗Referer头和/或恶意覆盖javascript函数。如果小部件提供商不信任所有从中受益的站点,那么小部件提供商可以做什么
    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');
    }