[C#]C#學習筆記-隔離存儲,序列化
C#學習筆記-隔離存儲,序列化
羅朝輝(http://www.rzrgm.cn/kesalin/)
《C#與.NET高級程序設計》讀書筆記
隔離存儲
1,由于.NET能加載來自不同位置來源的程序集,信任問題就很重要,我們要確保不同來源的程序集不會讀取系統的敏感數據,進行不安全的操作。在.NET 平臺上,是通過CAS(代碼訪問安全)的安全機制來處理信任問題的。使用CAS,CLR可以拒絕或授權許多可執行程序集的安全權限。包括:機器目錄/文件結構的操作;網絡/Web/數據庫連接的操作;新建應用程序域/動態程序集;使用.NET反射服務;使用PInvoke進行非托管代碼調用。
2,System.IO.IsolatedStorage命名空間中的類型可以使用隔離存儲,向裝有.NET的機器創建應用程序以讀寫數據到特殊位置。這可以理解為安全“沙盒”,在里面CLR會允許I/O操作,即使應用程序是從外部URL下載或從其他方式弄來的,都會由系統管理員放在安全的沙盒中。使用隔離存儲我們可以在一定程度上持久化每一個用戶的數據,以確保其他應用程序不能直接或間接破壞這些數據;此外,使用持久存儲,我們的代碼不需要在應用程序內硬編碼路徑或目錄名,應用程序間接保存數據到一個獨特的數據倉庫中,它會和代碼標識的一些方面進行關聯,比如它的URL,強名或X509數字簽名。
3,為了解決由下載或執行遠程.NET程序集引起的安全問題,CLR會自動檢測程序的標識并把它賦值給配置的代碼組中的一個,簡單來說,代碼組是一組符號相同標識(比如來源)的程序集。CLR用來檢測程序集屬于哪個代碼組的標準是指證據,除了來源,程序集也可以使用其他形式的證據放入代碼組,比如程序集強名,X509簽名數字標識或其他自定義標準。在評估了程序集證據以確定程序集屬于哪個代碼組之后,CLR就會查詢和代碼組關聯的權限集來看程序集可以做什么,更重要的是不可以做什么。總的來說,代碼組和它們關聯的權限構成了安全策略,它被分成3個主要的級別(企業,機器以及用戶),使用這種分層方法,系統管理員就可以在公司級別以及機器和用戶的級別來創建唯一的策略。在所有安全策略(企業,機器和用戶)被應用之后,程序集就會在.NET 運行庫下執行,如果程序集嘗試執行在其權限集之外的代碼,CLR就會拋出運行時安全異常。
4,CLR首先從加載到內存中的程序集中讀取證據,這個過程是自動的,當然我們也可以以編程方式讀取證據或利用發射API和System.Security.Policy命名空間的Evidence來讀取。CLR利用讀取的證據把程序集放到代碼組中,每一個代碼組都被映射到一個具有默認安全設置集合(CLR用來判斷程序可做什么或不可做什么)的安全區域,因此代碼組就被授予一組權限并給予一個優化名稱,如Full Trust,Internal等,每一個權限集是控制各種安全設置的單個配置權限的集合,因此程序集能進行的操作就被限定在這些權限內。
5,隔離存儲的跟路徑在用戶目錄下的<user>\App Data\Local\IsolatedStorage(Vista)或<user>\Local Settings\Application Data\IsolatedStorage中,放到隔離存儲中的數據,和任何文件系統一樣,可以被用戶復制,移動或刪除。隔離存儲有一些不足,它不會對放到隔離存儲中的數據進行自動加密,因此一些敏感數據需要手動加密。
序列化
6,使用對象序列化,我們可以持久化一個對象的狀態到任何System.IO.Stream派生的類型中。我們可以使用[Serializable]特性類序列化類;如果某個域不需要被序列化,只需在這個域前加上[NonSerialized]特性,這樣做可以減少持久化數據的大小。
7,使用BinaryFormatter持久化一個對象,會將它的所有需要序列化字段序列化;如果使用XmlSerializer或SoapFormatter類型的話,只有公共字段數據或擁有公共屬性的私有數據可以被序列化。
浙公網安備 33010602011771號