比如
delete globalThis.fetch
....
还有可能再次获取到 fetch 吗?
或者
delete ArrayBuffer
...
还有可能再创建 ArrayBuffer(new ArrayBuffer(8))吗?
delete globalThis.fetch
....
还有可能再次获取到 fetch 吗?
或者
delete ArrayBuffer
...
还有可能再创建 ArrayBuffer(new ArrayBuffer(8))吗?
|
WizardMeowJun 5, 2021 via Android
1
iframe
|
|
2
@WizardMeow 的确有可能,那就加个限定吧,nodejs 环境下
|
|
loveJun 5, 2021
3
我觉得 ArrayBuffer 这类内置对象有可能可以从别的库引用中得到,比如某个 api 返回一个 ArrayBuffer 对象,那就可以通过 .constructor 得到 ArrayBuffer 引用了
|
|
hxsfJun 5, 2021
4
node 内置的 vm 模块不够用?
|
|
RocketerJun 6, 2021 via iPhone
5
真能删除吗? JS 里可是一切皆对象,你以为它是某个类下面的函数,其实函数本身是独立对象,那个类只是引用了一下。
所以你删掉的也只是一个引用,只有所有引用全部没了,这个对象才可能被回收。 |
|
oott123Jun 6, 2021
6
简单试了试,似乎不太容易
不过你问有没有可能我觉得还是有可能的…… |
|
7
@hxsf vm 限制不了内存,退一步,nodojs 也根本没法限制 Buffer 之类的内存,分配多少拦不住
|
|
8
@love 的确,那要达到目的还得把相关的功能也删了
|
|
hxsfJun 7, 2021
9
|
|
10
@hxsf 我现在用的 vm2,vm2 也没法限制这些内置接口吧,原始问题就是内存限制问题,但我确认 nodejs 是不可能能限制内存的,只能把这些耗内存较大的东西在代码开头移除
|
|
hxsfJun 7, 2021
11
@xieqiqiang00 #10 开子进程啊,然后外部控制内存占用,使用 v8-options 或者 cgroups
|
|
xingguangJun 7, 2021
12
不行,我记得内置的模块都是不可操作的
|
|
13
@hxsf 不可以的,我现在就是开的子进程,不能限制 buffer 一类的内存,这种内存不属于 V8 的管理部分。
cgroups 不考虑,我想在 Windows 上也能运行 |
|
14
@xingguang 如果能把所有的引用都干掉的话,就能达到“删掉”的效果了
|
|
15
@hxsf 而且 VM 也没法删除这些内置对象
|
|
muzuigetJun 7, 2021
16
有些是只读属性删除或者修改不了的。
|
|
muzuigetJun 7, 2021
17
感觉就是 X/Y 问题,我猜楼主其实需要一个 JS 的沙盒环境。
|
|
18
@muzuiget 原始的确是 JS 沙箱,常见的几个都试了,现在这个是最终妥协出来的方案,用 vm2+禁止 buffer 类的功能
|
|
kfllJun 7, 2021
19
|
|
20
@kfll 这个我之前试过了太麻烦了,不考虑这个,啥都不支持,fetch 都要自己去通信
|
|
21
@love 我尝试了一下,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); } } } } |
|
22
@love 上面的代码有问题,这个才对
{ 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); } } } } |