【问题标题】:Protecting a JavaScript object against external scripts保护 JavaScript 对象免受外部脚本的影响
【发布时间】:2015-12-20 17:50:13
【问题描述】:

网络应用模型

假设我有一个敏感的 JS 对象,我可以通过它来做关键的事情。我的要求是我想完全包装这个对象,这样没有人可以访问它。这是我包装这个对象的模式。

var proxy = (function (window){
    // A private reference to my critical object (i.e. big apple)
    var bigApple = window.bigApple;

    // Delete this property so that no one else can access it
    delete window.bigApple;

    // Oooah, It's mine! I'm now eating it :)

    // Public APIs exposed globally
    return {
        doStuffWithBigApple: function (){

            // The Script element being executed now
            var who = document.currentScript;

            // Access control
            if(isLegitimate(who)){
                return bigApple.doStuff();
            }
        }
    };
}) (window);

通过这段代码,我导出了一个名为 proxy 的公共文字对象,以便每个人都可以访问它。

isLegitimate 是什么?这是一个要实现的抽象函数,它决定哪些script 元素访问我的大苹果的哪些方法。该决定是针对script 元素的src 属性做出的。 (即他们的域名)

其他人像这样使用这个公共 API:

proxy.doStuffWithBigApple();

攻击模型

在我的网络应用程序中有广告占位符,以便可以加载和执行包括 JavaScript 代码在内的外部内容。所有这些外部资源都急切地想要访问我的大苹果。

注意:这些是在我的脚本之后添加的,导致无法访问原始window.bigApple

我的问题

我的安全模型有什么规避方法吗?

关键边缘:

  • 在解析时更改src 属性。 --- 不可能,因为src 只能设置一次。
  • 在运行时添加 script 元素 --- 没有问题出现

【问题讨论】:

  • 只是想知道您要保护您的网站免受什么侵害 - 即恶意广告商脚本不能实现他们自己的 bigApple 吗?一些网站在 IFrame 中加载广告客户内容,以防止每个 IFrame 中的脚本通过 SOP inheritance rules 引用父页面。
  • @SilverlightFox 我不想在我的网站中实现这个逻辑,因为我已经知道 IFrame 是一种众所周知的沙盒不受信任脚本的方法。我的目的是将这种逻辑带到可能无法满足 SOP 原则的混合移动应用程序中。

标签: javascript html security access-control


【解决方案1】:

这种保护 JavaScript 对象的方式有一个非常重要的问题需要解决,否则这种方式将无法正常工作。

MDN 在此 API 上指出:

需要注意的是,如果脚本中的代码作为回调事件处理程序被调用,这将不会引用<script>元素;它只会在最初处理时引用元素。

因此,在回调和事件处理程序中对 proxy.doStuffWithBigApple(); 的任何调用都可能导致您的框架行为不端。

【讨论】:

    【解决方案2】:

    您创建代理的想法很好 imo,但是,如果您可以访问 ES6,为什么不研究 Proxy?我认为它可以满足您开箱即用的需求。

    MDN 提供了很好的示例,说明如何在 setter 中设置陷阱以进行值验证等。

    编辑:

    可能的陷阱我想象过:
    IE 不支持document.currentScript。因此,如果您关心它并决定填充它/使用预先存在的 polyfill,请确保它是安全的。或者它可以用来动态修改document.currentScript返回的外部脚本url并倾斜代理。我不知道这是否会发生在现实生活中。

    【讨论】:

    • 听起来不错。但是我自己的代理没有问题。我的问题是攻击者如何绕过我的安全模型。正如我所检查的,主要浏览器仍然不支持它。
    • 这看起来不错,因为我认为没有办法覆盖 document.currentScript 设置器。并非所有浏览器都支持它。如果您使用 pollyfill,只需检查它是否实现了所需的安全性,否则它可能会被覆盖并创建一个陷阱。
    • 感谢 Polyfill。它可以帮助我。
    猜你喜欢
    • 2012-12-20
    • 2014-10-15
    • 2022-12-14
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多