Effective C# 学习笔记(四十八)使用安全代码
2011-08-07 10:04 小郝(Kaibo Hao) 阅读(497) 评论(0) 编辑 收藏 举报.NET 运行时保证了恶意代码不可在远程设备上(即跨Internet、Intranet)执行,但一些分布式部署的应用需要执行远程操作。若CLR不信任某个程序集,它就不会执行程序集的某个操作,这种机制叫做CAS(Code access security)。CLR执行基于角色的权限控制。这种控制是在运行时校验的,编译时无法强制检验,而且在你的开发机上也很难发现这些权限控制的约束,因为你硬盘上的代码拥有较高的执行权限。在处理此类非安全代码时,原则是首先看能否通过其他方式不去访问这些受保护的资源;若必须使用,则将这些代码放到一个独立的程序集中。
一般情况下,你不需要获取CAS的特权,除非你涉及到以下资源的访问:
- 非托管内存
尽量不要访问非托管内存,若必须访问,则将部分处理代码单独放在一个程序集中
- 文件系统
你可以通过基于程序集、应用程序域及当前用户的授权方式来处理文件系统的访问控制。
使用独立存储来解决程序集访问资源控制的问题。独立存储访问资源控制的命名空间 System.IO.IsolatedStorage。
举例:
//写操作
//创建访问资源控制对象
IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForDomain();
//创建独立存储文件流
IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("SavedStuff.txt", FileMode.Create, iso);
//初始化流写入器
StreamWriter wr = new StreamWriter(myStream);
// several wr.Write statements elided
wr.Close();
//读操作
IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForDomain();
string[] files = isoStore.GetFileNames("SavedStuff.txt");
if (files.Length > 0)
{
StreamReader reader = new StreamReader(new
IsolatedStorageFileStream("SavedStuff.txt", FileMode.Open, isoStore));
// Several reader.ReadLines( ) calls elided.
reader.Close();
}
对于独立存储空间(Isolated storage)来说,应注意以下几点:
- .NET运行环境限制了该存储空间的大小,以防止恶意代码利用该特性占用过多的磁盘空间
- 该存储空间对于其他的程序和用户是不可见的,不要将其用为部署配置的存储空间,否则administrator用户也改不了。
- 独立存储空间对非托管代码或可信用户来说是可以访问的,所以不要把其作为高密级的存储空间来时使用。
- 数据库
为应用程序集获得完全的信任权限。
- 网络端口
- 为应用程序集获得完全的信任权限。
- Windows 注册表
为应用程序集获得完全的信任权限。
例如:若你的程序需要访问注册表,请将其安装在该设备上,以获得足够的权限。
- 打印子系统
为应用程序集获得完全的信任权限。
注意:一个安全的程序集应不使用指针来访问托管及非托管资源。
出处:http://www.cnblogs.com/haokaibo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。