【问题标题】:Javascript Advanced ClosureJavascript 高级闭包
【发布时间】: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


【解决方案1】:

在您的edited版本中,将 alert(x) 更改为 alert(this.x)。 它解决了你的问题吗?

【讨论】:

  • 这确实有效,但是因为用户提供的是代码而不是我,所以我不能完全要求他们在每个变量的前面输入这个。你看的目的是从用户提交的代码中隐藏第二个 x。
【解决方案2】:

事实证明,答案比我想的要简单得多。在全局范围内但在封闭函数之外的函数可以被任何函数调用,但它只能访问全局范围内的变量。因此,下面的示例完美运行。

<script>

var run = function(){alert(x);};
var x = 2;
(function(){
    var x = 10;
    var elem = document.createElement('button');
    elem.addEventListener('click',run);
    document.body.appendChild(elem);
})();

</script>

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2019-11-24
    • 2012-06-12
    • 2015-04-15
    相关资源
    最近更新 更多