1

通过同一页面上的脚本标签包含的两个脚本是否可以相互保密?

例如,如果一个脚本包含

(function (myArg) {

    //do stuff with secret string

}('secretstring'));

页面上包含的另一个脚本是否有任何途径来确定“秘密字符串”?

4

3 回答 3

2

你可以运行这个 jQuery 代码:

$('script').each(function() {
    alert(this.src); // $(this).html() or .text() will show any inline script content
});

它将显示可用于加载任何脚本内容的 URL。

加载的内容将包含“secretString”以及所有 javascript。

要让脚本得到一些东西,需要做很多工作。但是,如果您允许通过网络加载脚本,那么它就不是秘密了。

一个人(但不是脚本)查看它的另一种方式是,如果浏览器或机器运行了代理,则可以看到所有加载的内容。这可以通过使用内置或可安装调试器在各种浏览器中完成。

于 2013-07-30T18:51:34.250 回答
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>
于 2013-07-30T18:47:13.923 回答
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又名自调用匿名函数对于隔离作用域很有用。

IIFE在 JavaScript 中遇到时会立即执行。

因此,a 和 b 具有不同的作用域,不能在彼此的作用域中使用。

JavaScript 中的 (function() { } )() 结构是什么?

http://benalman.com/news/2010/11/immediately-invoked-function-expression/

于 2013-07-30T18:44:17.340 回答