在同一页面上通过脚本标记包含的两个脚本是否可以彼此保持秘密?包含的脚本保持相互的秘密
例如,如果一个脚本包含
(function (myArg) {
//do stuff with secret string
}('secretstring'));
是有另一个脚本任何途径包括在页面上,确定“secretstring”?
在同一页面上通过脚本标记包含的两个脚本是否可以彼此保持秘密?包含的脚本保持相互的秘密
例如,如果一个脚本包含
(function (myArg) {
//do stuff with secret string
}('secretstring'));
是有另一个脚本任何途径包括在页面上,确定“secretstring”?
秘密不是正确的字。 这称为自调用匿名函数。
(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又名自我援引匿名功能是隔离范围有用。
IIFE会在JavaScript中遇到时立即执行。
所以,a和b有不同的范围,不能用在彼此的范围中。
What is the (function() { })() construct in JavaScript?
http://benalman.com/news/2010/11/immediately-invoked-function-expression/
依赖。
从程序逻辑的角度来看,除非显式导出,否则闭包内的变量不能从外部访问。
从安全角度来看,无法访问变量值,但仍可通过toString
访问函数的定义。如果函数没有链接到全局变量(包括dom),并且它来自外部文件,并且未嵌入到文档中(在这种情况下,可能会使用innerHTML
),并且它与该文件不在同一个域中页面(在这种情况下,可以将文件加载到iframe
中,然后阅读它的源代码)......然后据我所知,无法访问它的源代码。
也可以重写许多内置的javascript函数。所以以下情形仍然存在(除非你的代码之前,任何不信任的代码运行,永不再次运行):
<script>
function grab(arg) {
// do something evil.
}
console.log = grab;
</script>
<script>
(function(myArg) {
console.log(myArg);
}('secret'));
</script>
您可以运行此jQuery代码:
$('script').each(function() {
alert(this.src); // $(this).html() or .text() will show any inline script content
});
,它会显示的网址可以用来加载任何脚本的内容。
加载的内容将包含'secretString'以及所有的javascript。
这是一个脚本来获取的很多工作。但是,如果您允许通过网络加载脚本,它并不是真正的秘密。
对于一个人(但不是脚本)来看它的另一种方式是,如果浏览器或机器运行代理,则可以看到所有加载的内容。这可以通过使用内置或可安装的调试器在各种浏览器中完成。
您可以在检索源代码时将一次性使用的令牌传递给服务器。这样,''secretstring''只显示给具有正确标记的第一个请求者。尽管如此,这并不能保护'.src'。 –
@AndrewLarsson这是一个非常好的主意,并且有清楚的解释。谢谢。它确实减少了查看它的方式。该脚本可以是可见的,但也可以使用一次性使用令牌加载该秘密。 –
是否有另一种加载脚本的方式,即使在XHR和X-Frame-Options被拒绝时源也可读取? –
那么,你从外部范围传递'secretstring'。如果这是一个变量,任何访问外部作用域的东西都可以看到它。除此之外,没有。 – bfavaretto
在这种情况下,除了传递给它的匿名函数之外,secrettstring不能被任何东西看到。 –
您可以迭代脚本标记并查找文件的.src并静态检查其内容。如果你在没有cors的情况下从场外为js服务,并且无论它运行在什么环境中都不会发出错误,那么它是安全的。 – dandavis