|
網(wǎng)絡(luò)技術(shù)是從1990年代中期發(fā)展起來(lái)的新技術(shù),它把互聯(lián)網(wǎng)上分散的資源融為有機(jī)整體,實(shí)現(xiàn)資源的全面共享和有機(jī)協(xié)作,使人們能夠透明地使用資源的整體能力并按需獲取信息。資源包括高性能計(jì)算機(jī)、存儲(chǔ)資源、數(shù)據(jù)資源、信息資源、知識(shí)資源、專家資源、大型數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)、傳感器等。 當(dāng)前的互聯(lián)網(wǎng)只限于信息共享,網(wǎng)絡(luò)則被認(rèn)為是互聯(lián)網(wǎng)發(fā)展的第三階段。 雖然權(quán)限種類眾多,但各種子類只負(fù)責(zé)定義自身權(quán)限的特性以及如何對(duì)自身權(quán)限驗(yàn)證,而所有的調(diào)用鏈遍歷和驗(yàn)證工作,都是由 CodeAccessPermission.Demand() 方法完成的: 以下內(nèi)容為程序代碼: 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 方法,實(shí)際上是將驗(yàn)證操作轉(zhuǎn)發(fā)給安全管理器 SecurityManager 的代碼訪問(wèn)安全引擎 CodeAccessSecurityEngine 類型的 Check 方法完成的。 以下內(nèi)容為程序代碼: 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 內(nèi)部類的 Check 方法,將最終調(diào)用通過(guò) Unmanaged 代碼實(shí)現(xiàn)的內(nèi)部方法進(jìn)行安全檢測(cè)。rotor 中的 COMCodeAccessSecurityEngine 類型 (ComCodeAccessSecurityEngine.cpp) 實(shí)現(xiàn)了這個(gè)檢測(cè)邏輯。 COMCodeAccessSecurityEngine::Check 函數(shù) (ComCodeAccessSecurityEngine.cpp:683) 通過(guò)調(diào)用 COMCodeAccessSecurityEngine::CheckInternal 函數(shù) (ComCodeAccessSecurityEngine.cpp:697) 填充一個(gè)堆棧遍歷請(qǐng)求結(jié)構(gòu) CasCheckWalkData 的內(nèi)容,最終將請(qǐng)求轉(zhuǎn)發(fā)給 StandardCodeAccessCheck 函數(shù) (ComCodeAccessSecurityEngine.cpp:563) 完成檢測(cè)。此結(jié)構(gòu)的指針將作為堆棧遍歷回調(diào)函數(shù)的參數(shù)傳遞給回調(diào)函數(shù)進(jìn)行實(shí)際權(quán)限驗(yàn)證,而 StandardCodeAccessCheck 只是負(fù)責(zé)調(diào)用全局堆棧遍歷支持 StackWalkFunctions 函數(shù)(StackWalk.cpp:512),以 CodeAccessCheckStackWalkCB 函數(shù) (ComCodeAccessSecurityEngine.cpp:449) 為回調(diào)函數(shù),以 CheckInternal 函數(shù)填充的 CasCheckWalkData 結(jié)構(gòu)為參數(shù),通過(guò)現(xiàn)成的堆棧遍歷支持 Thread::StackWalkFrames 完成堆棧遍歷。 通過(guò)堆棧遍歷實(shí)現(xiàn)代碼訪問(wèn)安全檢測(cè)調(diào)用流程如下: 以下為引用: CodeAccessSecurityEngine::Check 內(nèi)部調(diào)用定義,由下面的函數(shù)實(shí)現(xiàn) COMCodeAccessSecurityEngine::Check 轉(zhuǎn)發(fā)檢測(cè)請(qǐng)求 (ComCodeAccessSecurityEngine.cpp:683) COMCodeAccessSecurityEngine::CheckInternal 填充 CasCheckWalkData 結(jié)構(gòu) (ComCodeAccessSecurityEngine.cpp:697) StandardCodeAccessCheck 執(zhí)行堆棧遍歷 Thread::StackWalkFrames 遍歷當(dāng)前線程堆棧 CodeAccessCheckStackWalkCB 檢測(cè)當(dāng)前組件權(quán)限 (ComCodeAccessSecurityEngine.cpp:449) 因此現(xiàn)在 CAS 檢測(cè)的問(wèn)題被分為兩個(gè)部分:如何遍歷調(diào)用堆棧;如何檢測(cè)某個(gè)組件是否擁有權(quán)限。 網(wǎng)絡(luò)的神奇作用吸引著越來(lái)越多的用戶加入其中,正因如此,網(wǎng)絡(luò)的承受能力也面臨著越來(lái)越嚴(yán)峻的考驗(yàn)―從硬件上、軟件上、所用標(biāo)準(zhǔn)上......,各項(xiàng)技術(shù)都需要適時(shí)應(yīng)勢(shì),對(duì)應(yīng)發(fā)展,這正是網(wǎng)絡(luò)迅速走向進(jìn)步的催化劑。 |
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!