【发布时间】:2013-02-03 14:40:56
【问题描述】:
我目前正在开发一个项目,该项目允许您在文本区域中输入 Javascript 并运行它。有很多后台代码监控页面并向服务器发送数据。所有这些都在一个私有函数中,因此无法简单地使用控制台闯入。那么唯一的问题是在 textarea 输入的代码在包含服务器函数的私有函数内部进行评估,从而使其能够访问站点的内部。我怎样才能隔离它并使它的范围在私有函数之外?下面是一个例子:
<script>
var x = 2;
(function(){
var x = 10;
var elem = document.createElement('button');
elem.addEventListener('click',function(){
alert(x);
});
document.body.appendChild(elem);
})();
</script>
在此示例中,我希望 x 在按下按钮时返回 2 而不是 10。从而强制它像在全局范围内一样运行。
编辑
我已尝试将函数绑定到似乎在正确路径上的窗口,但没有达到我想要的效果。
<script>
var x = 2;
(function(){
var x = 10;
var elem = document.createElement('button');
elem.addEventListener('click',(function(){
alert(x);
}).bind(window));
document.body.appendChild(elem);
})();
</script>
我也尝试将窗口应用到函数中,但可惜也没有用。
【问题讨论】:
-
“所有这些都在一个私有函数中,因此无法简单地使用控制台闯入。”是的,好像人们无法使用您在脚本中提供的数据伪造 XHR 请求。安全和验证与前端无关,您必须在后端进行验证。
-
嗯,但是它迫使人们真正阅读和理解脚本,而不是仅仅在控制台中弄乱变量,这会有些困难,因为我使用的是彗星频道并且频道是创建和限制的到私人功能。一旦在页面中创建一次,就不允许复制我认为的频道。因此,仅通过控制台使用频道变得更加困难。
-
您无法访问在闭包外部声明的第一个
x,因为它被闭包内部声明的x遮蔽。如果您从第三行中删除关键字var,您将可以访问该外部变量,但是您将在同一行(现在只是x = 10)上覆盖它的值,这不是您想要的想要。这是通常与使用全局变量相关的众多问题之一。 -
如果在全局范围内,可以使用
window.x。不知道彗星是否会影响这一点。
标签: javascript security function code-injection