禁用JavaScript加载页面中任何内容的功能

时间:2018-03-20 20:56:22

标签: javascript security

我正在控制白名单网站的过程中,作为短期措施,我需要确保禁用加载第三方脚本的功能,直到我可以执行roper审核。另一种方法是阻止访问所有这些页面,这是我不在乎的核选项。

因此我尝试编写一个JavaScript的小片段,我可以在加载任何其他内容之前插入HEAD。这应该优雅地阻止添加任何可以报告或动态加载第三方的东西(然后加载更多的东西......)。它不必是防弹的(我不期望任何试图通过托管外部脚本的人来绕过它)。

这是我开始的地方:

(function(document, window) {

    var noop = function(x) { return [] };

    XMLHttpRequest = function(){}
    XMLHttpRequest.prototype = {
        open: function(){},
        send: function(){}
    }

    var restrictDocumentList = [ "eval", "write" ];
    var len = restrictDocumentList.length;
    for (var i=0; i<len; i++) {
        document[ restrictDocumentList[i] ] = noop;
    }

    var restrictElementList = [ "appendChild" ];
    var len = restrictElementList.length;
    for (var i=0; i<len; i++) {
        Element.prototype[ restrictElementList[i] ] = noop;
    }

})(document, window);

我的问题是:

  1. 我应该考虑哪些情况?
  2. 有没有人这样做过? (我猜测并希望这是肯定的)
  3. 有更好的方法吗?
  4. 对于记录,对于我的情况,使用META标记来阻止外部脚本加载不是一种选择。例如:

    <meta http-equiv="Content-Security-Policy" content="script-src 'self'">
    

1 个答案:

答案 0 :(得分:1)

一般建议

尝试在JS中解决此任务时,您可能会遇到大量问题。我试图这样做,并且我提出了很多解决方案,所以我决定提到Content Security Policy

  

https://developers.google.com/web/fundamentals/security/csp/

它在浏览器级别进行管理,因此远远高于JS沙箱。它由all the modern browsers支持。

您不必将其用作元标记(我也不建议这样做)。我更喜欢将其添加为防火墙/代理组件中的标头。它为您提供了更多控制权(例如,您不必在更改时重新部署应用程序,这将成为配置更改而不是编程解决方案)。我使用此工具为应用程序生成标题:

  

https://www.cspisawesome.com/

如果你真的想这样做

你需要涵盖很多案件。我走了这么远:

  • 以某种方式禁用所有XMLHTTPRequests
  • 以某种方式禁用所有文档附加+ eval
  • 以某种方式禁用所有&#34; src&#34;更改( document.getElementByTagName(&#34;脚本&#34;)
  • 以某种方式摆脱iframes(你可以调用附加iframes中的方法)
  • 以某种方式摆脱网页组装......
  • 列表继续

主要问题(我放弃的地方)是你可以只用6个字符在JS中写任何东西......你可以在你的控制台中运行它:

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

基本上不超过这个:

  

的eval(&#34;警报(1)&#34)

但是我们可以想象这种代码可以隐藏什么......

<强> TL.DR。 创建CSP是为了向浏览器发出正确的行为信号,以便他们可以处理它,因为在JS中有一个解决方法可以解决所有问题。

我建议不要使用元标记,但要添加标题以确保您的网站安全。如果您使用的是Apache HTTPD,那么这很容易:

Header set Content-Security-Policy "default-src 'self';"