我正在控制白名单网站的过程中,作为短期措施,我需要确保禁用加载第三方脚本的功能,直到我可以执行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);
我的问题是:
对于记录,对于我的情况,使用META
标记来阻止外部脚本加载不是一种选择。例如:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'">
答案 0 :(得分:1)
一般建议
尝试在JS中解决此任务时,您可能会遇到大量问题。我试图这样做,并且我提出了很多解决方案,所以我决定提到Content Security Policy
:
https://developers.google.com/web/fundamentals/security/csp/
它在浏览器级别进行管理,因此远远高于JS
沙箱。它由all the modern browsers支持。
您不必将其用作元标记(我也不建议这样做)。我更喜欢将其添加为防火墙/代理组件中的标头。它为您提供了更多控制权(例如,您不必在更改时重新部署应用程序,这将成为配置更改而不是编程解决方案)。我使用此工具为应用程序生成标题:
如果你真的想这样做
你需要涵盖很多案件。我走了这么远:
iframes
(你可以调用附加iframes
中的方法)主要问题(我放弃的地方)是你可以只用6个字符在JS
中写任何东西......你可以在你的控制台中运行它:
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
基本上不超过这个:
的eval(&#34;警报(1)&#34)
但是我们可以想象这种代码可以隐藏什么......
<强> TL.DR。强>
创建CSP是为了向浏览器发出正确的行为信号,以便他们可以处理它,因为在JS
中有一个解决方法可以解决所有问题。
我建议不要使用元标记,但要添加标题以确保您的网站安全。如果您使用的是Apache HTTPD,那么这很容易:
Header set Content-Security-Policy "default-src 'self';"