JS,在脚本的开头将 fetch 之类的引用给 delete,后面还有办法能获取到吗?
- 0次
- 2021-08-10 01:58:50
- idczone
比如
delete globalThis.fetch
....
还有可能再次获取到 fetch 吗?
或者
delete ArrayBuffer
...
还有可能再创建 ArrayBuffer(new ArrayBuffer(8))吗?
iframe
的确有可能,那就加个限定吧,nodejs 环境下
我觉得 ArrayBuffer 这类内置对象有可能可以从别的库引用中得到,比如某个 api 返回一个 ArrayBuffer 对象,那就可以通过 .constructor 得到 ArrayBuffer 引用了
node 内置的 vm 模块不够用?
真能删除吗? JS 里可是一切皆对象,你以为它是某个类下面的函数,其实函数本身是独立对象,那个类只是引用了一下。
所以你删掉的也只是一个引用,只有所有引用全部没了,这个对象才可能被回收。
简单试了试,似乎不太容易
不过你问有没有可能我觉得还是有可能的……
vm 限制不了内存,退一步,nodojs 也根本没法限制 Buffer 之类的内存,分配多少拦不住
的确,那要达到目的还得把相关的功能也删了
你不说原始需求,大家也没法一次性帮你解决你没说的问题啊?
vm 完美解决你正文提到的上下文控制的问题。内存问题你正文也没说啊?
《提问的智慧》了解下?
我现在用的 vm2,vm2 也没法限制这些内置接口吧,原始问题就是内存限制问题,但我确认 nodejs 是不可能能限制内存的,只能把这些耗内存较大的东西在代码开头移除
开子进程啊,然后外部控制内存占用,使用 v8-options 或者 cgroups
不行,我记得内置的模块都是不可操作的
不可以的,我现在就是开的子进程,不能限制 buffer 一类的内存,这种内存不属于 V8 的管理部分。
cgroups 不考虑,我想在 Windows 上也能运行
如果能把所有的引用都干掉的话,就能达到“删掉”的效果了
而且 VM 也没法删除这些内置对象
有些是只读属性删除或者修改不了的。
感觉就是 X/Y 问题,我猜楼主其实需要一个 JS 的沙盒环境。
原始的确是 JS 沙箱,常见的几个都试了,现在这个是最终妥协出来的方案,用 vm2+禁止 buffer 类的功能
https://github.com/laverdet/isolated-vm
独立线程 V8 沙盒
这个我之前试过了太麻烦了,不考虑这个,啥都不支持,fetch 都要自己去通信
我尝试了一下,delete 之后即使是 XHR 返回的 arraybuffer 也是指向的全局里的 arraybuffer,如果我删了全局的 arraybuffer,虽然 XHR 可以返回 arraybuffer 对象但没法再构造新的 arraybuffer 了
代码如下
{
delete ArrayBuffer//不 delete 这个,后面的 new arraybuffer(8)是可以执行成功的
//ArrayBuffer 的引用已被清除
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://cdn.jsdelivr.net/gh/WildXBird/r6sground.cn/cache.txt", true)
xhr.responseType = "arraybuffer"
xhr.send()
xhr.onreadystatechange = () => {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status <= 300) {
let res = xhr.response
console.log(typeof (res))
console.log(res)
let arraybuffer = res["__proto__"].constructor
const buffer = new arraybuffer(8);
console.log(buffer.byteLength);
}
}
}
}
上面的代码有问题,这个才对
{
let tab = new ArrayBuffer(8)
tab["__proto__"].constructor = {}//不重写这个,后面的 new arraybuffer(8)是可以执行成功的
delete tab
//ArrayBuffer 的引用已被清除
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://cdn 点 jsdelivr 点 net/gh/WildXBird/r6sground.cn/cache.txt", true)
xhr.responseType = "arraybuffer"
xhr.send()
xhr.onreadystatechange = () => {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status <= 300) {
let res = xhr.response
console.log(typeof (res))
console.log(res)
let arraybuffer = res["__proto__"].constructor
const buffer = new arraybuffer(8);
console.log(buffer.byteLength);
}
}
}
}