ASP.NET運(yùn)行模式的權(quán)限說(shuō)明圖:
ASP.NET的默認(rèn)運(yùn)行模式是FULL TRUST 級(jí)別,在該級(jí)別下.NET程序擁有極高的權(quán)限執(zhí)行程序或者代碼。但是讓程序運(yùn)行在該模式下是十分危險(xiǎn)的,黑客可以輕易地利用你的程序進(jìn)行提權(quán)。國(guó)外空間,比如GoDaddy通常會(huì)把ASP.NET代碼執(zhí)行權(quán)限控制在中等安全模式。我司決定將ASP.NET的運(yùn)行模式調(diào)為中等信任級(jí)別。
中等安全模式會(huì)有哪些影響?
以下是在ASP.NET中等安全模式下曾經(jīng)遇到過(guò)的一些問(wèn)題:
1. 基于VirtualPathProvider的模板機(jī)制不能用,因?yàn)?/span>VirtualPathProvider至少需要運(yùn)行在High模式。
2. BuildProvider不能用,意味著你想自己添加自己的語(yǔ)言實(shí)現(xiàn)也不能用了,不過(guò)大部分項(xiàng)目不會(huì)用到這么高級(jí)的東西。
3. CodeDom、Emit不能用了,這下慘了,什么Ioc、AOP,動(dòng)態(tài)注入的高科技玩意兒,全都廢了,這些不是基于CodeDom的就是基于Emit的。
4. 通過(guò)aspx頁(yè)面接管文件下載也不行了,Response寫文件流到客戶端需要更高的代碼執(zhí)行權(quán)限。
5. 大文件上傳也別想了,因?yàn)榇笪募蟼魅f(wàn)變不離HttpWorkRequst,獲取HttpWorkRequst的代碼需要FullTrust模式。
6. SQLite不能用了,因?yàn)橹械劝踩J较聸]有非托管代碼調(diào)用權(quán)限,所以除了SQLite外,涉及到非托管代碼調(diào)用的,也都廢掉了。
所以,如果要考慮允許讓用戶把程序部署到中等安全模式下,那就越早做中等安全模式的兼容性測(cè)試越好。
因?yàn)楹芏嗖荒苡玫臇|西,都是涉及到基礎(chǔ)結(jié)構(gòu)的。
比如,文件下載不能通過(guò)Response寫文件流的方式,你的程序正巧又是這么做防盜鏈,咋辦?
答:用.htaccess做偽靜態(tài)。
中等信任級(jí)別的主要限制:
不能調(diào)用非托管代碼
不能調(diào)用服務(wù)組件
不能寫事件日志
不能訪問(wèn) Microsoft 消息隊(duì)列
文件訪問(wèn)僅限于當(dāng)前應(yīng)用程序目錄
注冊(cè)表訪問(wèn)是不允許的
如果因?yàn)檎{(diào)整了安全級(jí)別導(dǎo)致您的網(wǎng)站出現(xiàn)訪問(wèn)異常的問(wèn)題,請(qǐng)根據(jù)信任級(jí)別的限制調(diào)整您的程序。
以下是判斷程序是否運(yùn)行在中等安全模式的代碼:
1 2 3 |
if (SecurityManager.IsGranted(new AspNetHostingPermission(AspNetHostingPermissionLevel.Medium))) { } |
如果有遇到不是必須執(zhí)行的邏輯,比如獲取程序內(nèi)存占用率或者大文件上傳,那就可以先判斷下,再?zèng)Q定是否調(diào)用。