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