保护全局变量以防止用户修改

时间:2018-03-13 10:19:31

标签: javascript security

对JavaScript的了解最少,我昨晚遇到了令我难过的东西。我知道不应该试图在JavaScript中安全地做任何事情,因为一切都在客户端运行,在用户的域中。

试图利用这一事实,我正在玩Chrome控制台,摆弄一个实时网站。我有两个帐户,一个帐户具有比另一个更高的权限,并设法确定一个全局变量/标志,它似乎根据此权限级别控制显示哪些UI元素。

现在就是这样:如果我尝试在无权限帐户上设置此标记,例如window.hasPermstrue,它似乎会立即重置为{{1} }。当我使用具有权限的帐户尝试相反的操作时 - 将false设置为window.hasPerms - 同样的事情发生了,但反过来了;它会立即重置为false

在页面的JS源代码中查找,我无法看到设置此标志的任何点。我尝试了一些其他的设置值,然后立即开始true;或创建〜5 debugger函数每1ms运行并设置变量,然后垃圾邮件将其记录到控制台,认为可能它会显示我的新值一次或两次。没有任何影响,所以现在我想知道:

这里有什么巫术,我不知道?是否可以保护变量,以便用户无法对其进行修改?如果没有,我可以用什么方法进一步挖掘,并试图找出重置价值的方法?

在谷歌上搜索,我找不到多少。我确实发现了一些setInterval的引用,我知道这个网站使用的,如果这很重要的话。除此之外,我并不认为网络技术正在被使用; Backbone和它一样先进。

1 个答案:

答案 0 :(得分:0)

最后,我通过在页面加载期间尽早注入此代码来解决它:

// save the original function
OBJECT_DEFINE_PROPERTY = Object.defineProperty;

// overwrite Object.defineProperty with our own wrapped version
Object.defineProperty = function (obj, prop, vals) {

    // modify values/writability as required, if it's a property we want control over
    if (prop === ... ) {
        vals.value = ... ;
        vals.writable = ... ;
    }

    // call the original function to define our (modified) property
    OBJECT_DEFINE_PROPERTY(obj, prop, vals);
};