通过同一页面上的脚本标记包含的两个脚本是否可以保持彼此的秘密?
例如,如果一个脚本包含
(function (myArg) {
//do stuff with secret string
}('secretstring'));
页面上是否包含其他脚本以确定'secretstring'?
答案 0 :(得分:2)
您可以运行此jQuery代码:
$('script').each(function() {
alert(this.src); // $(this).html() or .text() will show any inline script content
});
它将显示可用于加载任何脚本内容的URL。
加载的内容将包含'secretString'以及所有javascript。
要为脚本获取某些内容,需要做很多工作。但是,如果您允许通过网络加载脚本,那么它实际上并不是秘密。
一个人(但不是脚本)看到它的另一种方式是,如果浏览器或机器运行了代理,则可以看到加载的所有内容。这可以通过使用内置或可安装的调试器在各种浏览器中完成。
答案 1 :(得分:1)
取决于。
从程序逻辑的角度来看,闭包内的变量是外部无法访问的,除非明确导出。
从安全角度来看,无法访问变量值,但仍可通过toString
访问函数的定义。如果一个函数没有链接到一个全局变量(包括dom),并且它来自一个外部文件,并且没有嵌入到文档中(在这种情况下可能会使用innerHTML
),而且它不在与页面相同的域(在这种情况下,可以在iframe
中加载文件,并读取它的来源)...然后据我所知,无法访问它的源。
也可以覆盖许多内置的javascript函数。因此,以下场景仍然存在(除非您的代码在任何不受信任的代码之前运行,并且永远不会再次运行):
<script>
function grab(arg) {
// do something evil.
}
console.log = grab;
</script>
<script>
(function(myArg) {
console.log(myArg);
}('secret'));
</script>
答案 2 :(得分:0)
秘密不是正确的词。 这称为自调用匿名函数。
(function () {
// all my code+all my variables
var a="some value";
// a can be used anywhere inside this
// b is unreachable here (it's undefined and hasn't even been instantiated in its own scope yet, as the anonymous function below gets invoked after this one has finished executing)
}());
// a is unreachable here (it's undefined)
(function () {
// all my code+all my variables
var b="some value";
// b can be used anywhere inside this
// a is unreachable here (it's undefined)
}());
// b is unreachable here (it's undefined)
IIFE 又名自调用匿名函数对于隔离范围非常有用。
在JavaScript中遇到IIFE 会立即执行。
因此,a和b具有不同的范围,并且不能彼此使用&#39;作用域。
What is the (function() { } )() construct in JavaScript?
http://benalman.com/news/2010/11/immediately-invoked-function-expression/