網絡技術是從1990年代中期發展起來的新技術,它把互聯網上分散的資源融為有機整體,實現資源的全面共享和有機協作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計算機、存儲資源、數據資源、信息資源、知識資源、專家資源、大型數據庫、網絡、傳感器等。 當前的互聯網只限于信息共享,網絡則被認為是互聯網發展的第三階段。 雖然權限種類眾多,但各種子類只負責定義自身權限的特性以及如何對自身權限驗證,而所有的調用鏈遍歷和驗證工作,都是由 CodeAccessPermission.Demand() 方法完成的: 以下內容為程序代碼: public void CodeAccessPermission.Demand() { CodeAccessSecurityEngine engine = SecurityManager.GetCodeAccessSecurityEngine(); if ((engine != null) && !this.IsSubsetOf(null)) { StackCrawlMark mark = StackCrawlMark.LookForMyCallersCaller; engine.Check(this, ref mark); } } 可以看到 CodeAccessPermission.Demand 方法,實際上是將驗證操作轉發給安全管理器 SecurityManager 的代碼訪問安全引擎 CodeAccessSecurityEngine 類型的 Check 方法完成的。 以下內容為程序代碼: internal class CodeAccessSecurityEngine { internal virtual void Check(CodeAccessPermission cap, ref StackCrawlMark stackMark) { if (!PreCheck(cap, null, 1, ref stackMark, PermissionType.DefaultFlag)) { Check(PermissionToken.GetToken(cap), cap, ref stackMark, -1, ((cap is IUnrestrictedPermission) ? 1 : 0)); } } internal virtual void Check(CodeAccessPermission cap, ref StackCrawlMark stackMark, PermissionType permType) { int num1 = 0; if (CodeAccessSecurityEngine.GetResult(permType, out num1)) { return; } if (this.PreCheck(cap, null, 1, ref stackMark, permType)) { CodeAccessSecurityEngine.SetResult(permType, num1); return; } this.Check(PermissionToken.GetToken(cap), cap, ref stackMark, -1, ((cap is IUnrestrictedPermission) ? 1 : 0)); } [MethodImpl(MethodImplOptions.InternalCall)] private void Check(PermissionToken permToken, CodeAccessPermission demand, ref StackCrawlMark stackMark, int checkFrames, int unrestrictedOverride); } CodeAccessSecurityEngine 內部類的 Check 方法,將最終調用通過 Unmanaged 代碼實現的內部方法進行安全檢測。rotor 中的 COMCodeAccessSecurityEngine 類型 (ComCodeAccessSecurityEngine.cpp) 實現了這個檢測邏輯。 COMCodeAccessSecurityEngine::Check 函數 (ComCodeAccessSecurityEngine.cpp:683) 通過調用 COMCodeAccessSecurityEngine::CheckInternal 函數 (ComCodeAccessSecurityEngine.cpp:697) 填充一個堆棧遍歷請求結構 CasCheckWalkData 的內容,最終將請求轉發給 StandardCodeAccessCheck 函數 (ComCodeAccessSecurityEngine.cpp:563) 完成檢測。此結構的指針將作為堆棧遍歷回調函數的參數傳遞給回調函數進行實際權限驗證,而 StandardCodeAccessCheck 只是負責調用全局堆棧遍歷支持 StackWalkFunctions 函數(StackWalk.cpp:512),以 CodeAccessCheckStackWalkCB 函數 (ComCodeAccessSecurityEngine.cpp:449) 為回調函數,以 CheckInternal 函數填充的 CasCheckWalkData 結構為參數,通過現成的堆棧遍歷支持 Thread::StackWalkFrames 完成堆棧遍歷。 通過堆棧遍歷實現代碼訪問安全檢測調用流程如下: 以下為引用: CodeAccessSecurityEngine::Check 內部調用定義,由下面的函數實現 COMCodeAccessSecurityEngine::Check 轉發檢測請求 (ComCodeAccessSecurityEngine.cpp:683) COMCodeAccessSecurityEngine::CheckInternal 填充 CasCheckWalkData 結構 (ComCodeAccessSecurityEngine.cpp:697) StandardCodeAccessCheck 執行堆棧遍歷 Thread::StackWalkFrames 遍歷當前線程堆棧 CodeAccessCheckStackWalkCB 檢測當前組件權限 (ComCodeAccessSecurityEngine.cpp:449) 因此現在 CAS 檢測的問題被分為兩個部分:如何遍歷調用堆棧;如何檢測某個組件是否擁有權限。 網絡的神奇作用吸引著越來越多的用戶加入其中,正因如此,網絡的承受能力也面臨著越來越嚴峻的考驗―從硬件上、軟件上、所用標準上......,各項技術都需要適時應勢,對應發展,這正是網絡迅速走向進步的催化劑。 |
溫馨提示:喜歡本站的話,請收藏一下本站!