2013-07-30 27 views
1

在同一页面上通过脚本标记包含的两个脚本是否可以彼此保持秘密?包含的脚本保持相互的秘密

例如,如果一个脚本包含

(function (myArg) { 

    //do stuff with secret string 

}('secretstring')); 

是有另一个脚本任何途径包括在页面上,确定“secretstring”?

+0

那么,你从外部范围传递'secretstring'。如果这是一个变量,任何访问外部作用域的东西都可以看到它。除此之外,没有。 – bfavaretto

+0

在这种情况下,除了传递给它的匿名函数之外,secrettstring不能被任何东西看到。 –

+0

您可以迭代脚本标记并查找文件的.src并静态检查其内容。如果你在没有cors的情况下从场外为js服务,并且无论它运行在什么环境中都不会发出错误,那么它是安全的。 – dandavis

回答

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有不同的范围,不能用在彼此的范围中。

What is the (function() { })() construct in JavaScript?

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

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

您可以运行此jQuery代码:

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

,它会显示的网址可以用来加载任何脚本的内容。

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

这是一个脚本来获取的很多工作。但是,如果您允许通过网络加载脚本,它并不是真正的秘密。

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

+1

您可以在检索源代码时将一次性使用的令牌传递给服务器。这样,''secretstring''只显示给具有正确标记的第一个请求者。尽管如此,这并不能保护'.src'。 –

+0

@AndrewLarsson这是一个非常好的主意,并且有清楚的解释。谢谢。它确实减少了查看它的方式。该脚本可以是可见的,但也可以使用一次性使用令牌加载该秘密。 –

+0

是否有另一种加载脚本的方式,即使在XHR和X-Frame-Options被拒绝时源也可读取? –