鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ nodejs讓用戶有執(zhí)行js代碼的權(quán)限,需要注意什么?

nodejs讓用戶有執(zhí)行js代碼的權(quán)限,需要注意什么?

我目前需要做一個(gè)功能,可以讓用戶執(zhí)行一個(gè)js代碼片段。這個(gè)js片段是nodejs運(yùn)行的。
使用eval(code),那么一細(xì)想,發(fā)現(xiàn)安全隱患還是挺大的。比如我把數(shù)據(jù)庫(kù)密碼什么的都放到一個(gè)配置文件里面。

他如果執(zhí)行了

console.log(appConfig);

這種代碼,等于知道我所有的配置了。類似的安全性問(wèn)題,防不勝防。有沒(méi)有一個(gè)參考的案例,我想看他們是如何解決類似的問(wèn)題的。

-----------補(bǔ)充--------------

沒(méi)想到一陣搜索,還真有類似的項(xiàng)目,這個(gè)叫做js沙箱。搜索“sandbox”

比如這個(gè)項(xiàng)目:https://www.npmjs.com/package...

回答
編輯回答
傻丟丟

自己整理了一下答案:
nodejs提供了vm模塊,相當(dāng)于一個(gè)沙盒模式。我試了運(yùn)行一段代碼,比如

var code = `console.log(require('fs'));`
//console.log(eval(code));
vm.runInContext(code, sandbox);

比如我擔(dān)心用戶會(huì)制造一段代碼,讀取服務(wù)器某些文件,但是測(cè)試發(fā)現(xiàn)會(huì)報(bào)錯(cuò):

因?yàn)樗麄兊纳澈兄懈揪蜎](méi)有這個(gè)require函數(shù),就沒(méi)有辦法加載包,更不會(huì)加載一些危險(xiǎn)的包,如vm與fs。

所以不必?fù)?dān)心引入其他的包。

我測(cè)試讀取了我的一個(gè)全局變量。

比如

console.log(appConfig);

是讀取不到信息的。

目前來(lái)看,安全性還可以。

參考資料:

http://nodejs.cn/api/vm.html

http://blog.csdn.net/zccz14/a...

2018年8月8日 02:07
編輯回答
刮刮樂(lè)

這個(gè)確實(shí)很危險(xiǎn),即使你過(guò)濾一些很敏感的執(zhí)行方法,還是有很大的風(fēng)險(xiǎn)的,什么場(chǎng)景下會(huì)有這樣的需求呢?

2017年11月28日 03:09