第1章.NET 体系结构
本章将基于.NET 4.0从整体上论述.NET框架的体系结构,并会从新的角度对与安全性较为相关的内容进行介绍。由于本书不同于编程类教程,因此许多细节问题只能进行简略概括或略掉不讲,有疑惑的读者可查找相关资料自行修炼。
从.NET安全的需要出发,本章主要介绍公共语言运行时(CLR)、公共类型系统(CTS)、公共语言规范(CLS)、中间语言(IL)、框架类库(FCL)、基础类库(BCL)、即时编译(JIT)和预编译,以及动态语言运行时(DLR),并且会从底层进行详细的解析。建议读者不要跳过本章。
1.1公共语言运行时
公共语言运行时(Common Language Runtime,CLR)为.NET Framework提供了托管运行环境,它负责运行托管代码,进行安全检查,垃圾回收等环节。本节只会对运行库进行概述,与安全相关的详细内容将在后续章节进行详细剖析。
微软公司为开发人员开发由CLR负责运行的程序创造了非常便利的条件,比如,开发工具及编译器会不断升级,且有丰富的文档详细介绍.NET开发的方方面面。使用基于CLR的语言编译器开发的代码称为托管代码。托管代码具有许多优点,例如跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
若要使CLR能够向托管代码提供服务,语言编译器必须生成一些元数据来描述代码中的类型、成员和引用。元数据与代码一起存储,每个可加载的CLR可移植执行(Portable Executable,PE) 文件都包含元数据。CLR使用元数据来完成以下任务:查找和加载类、在内存中安排实例、解析方法调用、生成本机代码、强制安全性,以及设置运行时上下文边界。
CLR自动处理对象布局并管理对象引用,当不再使用对象时就会释放它们。按这种方式实现生存期管理的对象称为托管数据。如果编写的代码是托管代码,可以在.NET Framework 应用程序中使用托管数据、非托管数据,或者同时使用这两种数据。由于语言编译器会提供自己的类型(如基元类型),因此你可能并不总是知道(或需要知道)这些数据是否是托管的。
有了CLR,就可以很容易地设计出对象能够跨语言交互的组件和应用程序。也就是说,用不同语言编写的对象可以互相通信,并且它们的行为可以紧密集成。例如,可以定义一个类,然后使用不同的语言从原始类派生出另一个类或调用原始类的方法,还可以将一个类的实例传递到用不同的语言编写的另一个类的方法。这种跨语言集成之所以成为可能,是因为基于CLR的语言编译器和工具使用了由CLR定义的通用类型系统,而且它们遵循CLR关于定义新类型以及创建、使用、保持和绑定到类型的规则。
所有托管组件都带有生成它们所基于的组件和资源的信息,这些信息构成了元数据的一部分。CLR使用这些信息确保组件或应用程序具有它所有所需内容的指定版本,这样就使代码不太可能由于某些未满足的依赖项而发生中断。注册信息和状态数据不再保存在注册表中(因为在注册表中建立和维护这些信息很困难)。取而代之的是,有关定义类型(及其依赖项)的信息作为元数据与代码存储在一起,这样就大大降低了组件复制和移除任务的复杂性。
语言编译器和工具公开CLR功能的方式对于开发人员来说不仅有用,而且很直观。这意味着,CLR的某些功能可能在某一环境中比在另一环境中更突出,对CLR的体验取决于所使用的语言编译器或工具。
……
展开
—— 51CTO(中国领先的IT技术网站)
2011年,国内安全领域最大的新闻莫过于数十家网站的用户数据被泄露的事件了。这件事情在当时影响极为广泛,它促使了国内的互联网企业重新思考网站安全的重要性并纷纷加强了网站的安全建设。网站安全的根基在于它的架构和具体实现,架构和实现过程中是否充分利用了技术的手段来保障安全性直接决定了网站是否安全可靠。如果你打算用.NET技术开发网站或相关的应用,抑或是你要负责维护用.NET技术开发的网站和应用的安全性,本书将为你提供全面的指导,它几乎讲解了.NET技术安全性的方方面面,值得学习和参考!
—— 马伟 资深微软技术专家和微软MVP/畅销书《ASP.NET 4权威指南》作者
安全永远是IT领域最重要、最热门的话题之一,它是IT产品和服务的核心。对于软件产品而言,它的安全性在最初的架构、设计和实现过程中就已经决定了,也就是说软件的安全性其实掌握在架构师和程序员手里。如果你是一位.NET程序员或架构师,你必须了解.NET平台的安全机制,以及各种.NET应用涉及的安全技术的细节,只有这样才能为你开发或架构的系统提供安全上的技术保障。目前市面上系统、深入讲解.NET安全知识的书不多,本书不可多得。
—— 郝冠军 资深微软技术专家和微软MVP/畅销书《ASP.NET本质论》作者