对JavaScript的了解最少,我昨晚遇到了令我难过的东西。我知道不应该试图在JavaScript中安全地做任何事情,因为一切都在客户端运行,在用户的域中。
试图利用这一事实,我正在玩Chrome控制台,摆弄一个实时网站。我有两个帐户,一个帐户具有比另一个更高的权限,并设法确定一个全局变量/标志,它似乎根据此权限级别控制显示哪些UI元素。
现在就是这样:如果我尝试在无权限帐户上设置此标记,例如window.hasPerms
到true
,它似乎会立即重置为{{1} }。当我使用具有权限的帐户尝试相反的操作时 - 将false
设置为window.hasPerms
- 同样的事情发生了,但反过来了;它会立即重置为false
。
在页面的JS源代码中查找,我无法看到设置此标志的任何点。我尝试了一些其他的设置值,然后立即开始true
;或创建〜5 debugger
函数每1ms运行并设置变量,然后垃圾邮件将其记录到控制台,认为可能它会显示我的新值一次或两次。没有任何影响,所以现在我想知道:
这里有什么巫术,我不知道?是否可以保护变量,以便用户无法对其进行修改?如果没有,我可以用什么方法进一步挖掘,并试图找出重置价值的方法?
在谷歌上搜索,我找不到多少。我确实发现了一些setInterval
的引用,我知道这个网站使用的,如果这很重要的话。除此之外,我并不认为网络技术正在被使用; Backbone
和它一样先进。
答案 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);
};