代码改变世界

Effective C# 学习笔记(四十八)使用安全代码

2011-08-07 10:04  小郝(Kaibo Hao)  阅读(497)  评论(0编辑  收藏  举报

.NET 运行时保证了恶意代码不可在远程设备上(即跨InternetIntranet)执行,但一些分布式部署的应用需要执行远程操作。若CLR不信任某个程序集,它就不会执行程序集的某个操作,这种机制叫做CAS(Code access security)CLR执行基于角色的权限控制。这种控制是在运行时校验的,编译时无法强制检验,而且在你的开发机上也很难发现这些权限控制的约束,因为你硬盘上的代码拥有较高的执行权限。在处理此类非安全代码时,原则是首先看能否通过其他方式不去访问这些受保护的资源;若必须使用,则将这些代码放到一个独立的程序集中。

 

一般情况下,你不需要获取CAS的特权,除非你涉及到以下资源的访问:

 

  1. 非托管内存

尽量不要访问非托管内存,若必须访问,则将部分处理代码单独放在一个程序集中

 

  1. 文件系统

你可以通过基于程序集、应用程序域及当前用户的授权方式来处理文件系统的访问控制。

使用独立存储来解决程序集访问资源控制的问题。独立存储访问资源控制的命名空间 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)来说,应注意以下几点:

  1. .NET运行环境限制了该存储空间的大小,以防止恶意代码利用该特性占用过多的磁盘空间
  2. 该存储空间对于其他的程序和用户是不可见的,不要将其用为部署配置的存储空间,否则administrator用户也改不了。
  3. 独立存储空间对非托管代码或可信用户来说是可以访问的,所以不要把其作为高密级的存储空间来时使用。

 

  1. 数据库

为应用程序集获得完全的信任权限。

 

  1. 网络端口

 

  1. 为应用程序集获得完全的信任权限。

 

  1. Windows 注册表

为应用程序集获得完全的信任权限。

例如:若你的程序需要访问注册表,请将其安装在该设备上,以获得足够的权限。

 

  1. 打印子系统

为应用程序集获得完全的信任权限。

 

注意:一个安全的程序集应不使用指针来访问托管及非托管资源。