默認(rèn)情況下,Deno是安全的。因此,除非您專(zhuān)門(mén)啟用它,否則deno模塊不能訪(fǎng)問(wèn)文件,網(wǎng)絡(luò)或環(huán)境。要訪(fǎng)問(wèn)安全敏感的區(qū)域或功能,需要使用在命令行授予deno進(jìn)程的權(quán)限。
對(duì)于以下示例,mod.ts已被授予對(duì)文件系統(tǒng)的只讀訪(fǎng)問(wèn)權(quán)限。它無(wú)法對(duì)其進(jìn)行寫(xiě)入或執(zhí)行任何其他對(duì)安全性敏感的功能。
deno run --allow-read mod.ts
權(quán)限清單
可以使用以下權(quán)限:
- -A,-- allow -all允許所有權(quán)限。這將禁用所有安全性。
- --allow-env允許環(huán)境訪(fǎng)問(wèn),例如獲取和設(shè)置環(huán)境變量。
- --allow-hrtime允許高分辨率時(shí)間測(cè)量。高分辨率時(shí)間可用于定時(shí)攻擊和指紋識(shí)別。
- --allow-net = <允許網(wǎng)絡(luò)>允許網(wǎng)絡(luò)訪(fǎng)問(wèn)。您可以指定一個(gè)可選的,用逗號(hào)分隔的域列表,以提供允許域的允許列表。
- --allow-plugin允許加載插件。請(qǐng)注意--allow-plugin是一個(gè)不穩(wěn)定的功能。
- --allow-read = <允許讀取>允許文件系統(tǒng)讀取訪(fǎng)問(wèn)。您可以指定目錄或文件的可選逗號(hào)分隔列表,以提供允許的文件系統(tǒng)訪(fǎng)問(wèn)的允許列表。
- --allow-run允許運(yùn)行子進(jìn)程。請(qǐng)注意,子流程未在沙箱中運(yùn)行,因此與deno流程沒(méi)有相同的安全限制。因此,請(qǐng)謹(jǐn)慎使用。
- --allow-write = <允許寫(xiě)>允許文件系統(tǒng)寫(xiě)訪(fǎng)問(wèn)。您可以指定目錄或文件的可選逗號(hào)分隔列表,以提供允許的文件系統(tǒng)訪(fǎng)問(wèn)的允許列表。
權(quán)限允許列表
Deno還允許您使用允許列表來(lái)控制某些權(quán)限的粒度。
此示例通過(guò)僅允許列出/usr 目錄來(lái)限制文件系統(tǒng)訪(fǎng)問(wèn),但是由于進(jìn)程嘗試訪(fǎng)問(wèn)/etc目錄中的文件,因此執(zhí)行失敗:
$ deno run --allow-read=/usr https://deno.land/std@0.95.0/examples/cat.ts /etc/passwderror: Uncaught PermissionDenied: read access to "/etc/passwd", run again with the --allow-read flag? $deno$/dispatch_json.ts:40:11 at DenoError ($deno$/errors.ts:20:5) ...
通過(guò)允許列表,以正確的權(quán)限再次嘗試/etc:
deno run --allow-read=/etc https://deno.land/std@0.95.0/examples/cat.ts /etc/passwd
--allow-write的工作原理與相同--allow-read。
網(wǎng)絡(luò)訪(fǎng)問(wèn):
fetch.ts:
const result = await fetch("https://deno.land/");
這是一個(gè)如何允許列出主機(jī)/ URL的示例:
deno run --allow-net=github.com,deno.land fetch.ts
如果fetch.ts嘗試建立與任何其他域的網(wǎng)絡(luò)連接,則該過(guò)程將失敗。
允許對(duì)任何主機(jī)/ URL的網(wǎng)絡(luò)呼叫:
deno run --allow-net fetch.ts
會(huì)議
瑞安·達(dá)爾(Ryan Dahl)。(2020年9月25日)。 Deno安全模型。Speakeasy JS。