首页 > 解决方案 > 如何在javascript中访问函数之外的数组

问题描述

我只是想知道如何解决这个奇怪的安全/范围问题:

function vector() {
    var array = [];
    return {
        append: function append(v) {
            array.push(v);
        },
        get: function get(i) {
            return array[i];
        },
        store: function store(i,v) {
            array[i] = v;
        }
    };
}

这是被问到的问题:

你能发现这种方法的任何安全问题吗?主要是,我们可以访问array外部vector吗?注意*:该问题与原型无关,我们可以假设全局原型无法更改。提示*:考虑this在方法调用中使用。我们可以覆盖向量的方法吗?

例子

var v = vector();
v.append(1);
v.append(2);
var internalData = exploitVector(v); // [1, 2]

我的尝试+想法

很确定我应该this按照提示所说的方式使用关键字。我是 javascript 的初学者,所以我不太了解context。此代码是在文本编辑器 Atom 上编写的具有其他功能的文件,而不是浏览器。

function exploitVector(v) {
    v.get = function() {
        return this.array;
    };
    console.log(v.get());
    return v.get();
}

另外,这只是我在 github repo 上看到的一个有趣的练习。

标签: javascriptfunctionsecuritythis

解决方案


Vector.store()可以滥用来修改数组方法(例如array.push),后跟av.append()来触发修改后的array.push方法。例如,修改后的 push 方法可以执行类似的操作window.visiblearray=this,之后可以全局访问 visiblearray。

或者如下例所示,将this(Array 实例)存储到本地作用域的 visiblearray 中,然后返回。

function vector() {
    var array = [];
    return {
        append: function append(v) {
            array.push(v);
        },
        get: function get(i) {
            return array[i];
        },
        store: function store(i,v) {
            array[i] = v;
        }
    };
}

var v = vector();
v.append(1);
v.append(2);
var internalData = exploitVector(v); // [1, 2]


function exploitVector(v) {
    var visible_array;
    v.store('push', function(x){visible_array=this}) // modify array push 
    v.append(12)                                     // trigger the modified array push
    console.log(visible_array);
    return visible_array
}


推荐阅读