首页
社区
课程
招聘
[原创]《.NET 安全揭秘》精彩放送—1.1、1.2节
发表于: 2012-5-23 00:23 4969

[原创]《.NET 安全揭秘》精彩放送—1.1、1.2节

2012-5-23 00:23
4969
http://pic002.cnblogs.com/images/2012/42533/2012051819354184.jpg
文/玄魂

前言

经华章图书的允许,我会陆续在博客上公开《.NET 安全揭秘》一书的部分章节。公开的内容不会和原书完全一致,会做适当的精简和改造。欢迎大家多提批评和改良的建议,笔者不胜感激。如果您喜欢本书,还望多多支持正版。

本系列索引博文:《.NET 安全揭秘》系列

第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的体验取决于所使用的语言编译器或工具。

1.2公共类型系统

众所周知,每一种编程语言都有自己的类型系统,但稍微接触过不同语言的读者都会发现,各种语言的类型系统都有许多相同或相似的地方。.NET利用各种语言相近的特性抽象出完整的一套公共类型系统(CTS),使所有类型独立于编写它们的源代码语言。CTS构成了.NET框架的公共语言运行时的基础,其中最重要的体现就是.NET平台的多语言支持,而运行于.NET平台的每一种语言又为了维护自己的语法特色,便使用别名来代替.NET的基础数据类型。CTS的引入解决了许多由多语言协作开发各个模块所带来的问题。

1.2.1       CTS基本结构

CTS不仅定义了所有的数据类型,并提供了面向对象的模型以及各种语言需要遵守的标准。CTS可以分为两个大类:值类型和引用类型,同时这两种类型之间还可以进行强制转换,从值类型到引用类型的转换称为Boxing(装箱),从引用类型到值类型的转换称为UnBoxing(拆箱)。

CTS的基本结构如图1-1所示,CTS的每一种类型都是对象,并继承自一个基类System.Object。


图1-1 CTS基本结构

1.       值类型和引用类型

值类型(Value Type)直接包含它们的数据,值类型的实例分配在堆栈。由上图可知,值类型主要包括简单类型、结构体类型和枚举类型等。

引用类型(Reference Type)的实例分配在托管堆(Managed Heap)上,变量保存了实例数据的内存引用。由图1-1可知,引用类型可以是自描述类型、指针类型或接口类型。而自描述类型可以进一步细分成数组和类类型。类的类型则可以是用户定义的类、装箱的值类型和委托。

2.       装箱和拆箱

上文已经提到,所谓“装箱”就是将值类型转换为引用类型,所谓“拆箱”就是将被装箱而成的引用类型转换为原来的值类型。代码清单1-1演示了最简单的装箱和拆箱。

 代码清单1-1 装箱和拆箱

using System;
class sample1
{

public static void Main()  

{

int i=10;  

object obj=i;   

Console.WriteLine(i+","+(int)obj);  

}
}

下面通过Main()方法的IL代码来简要分析这段代码中的装箱与拆箱,如代码清单1-2所示。关于IL代码的更多信息将在1.3节做详细介绍。

代码清单1-2  装箱和拆箱的IL代码

.method public hidebysig static void  Main() cil managed

{

  .entrypoint

  // Code size       45 (0x2d)

  .maxstack  3

  .locals init ([0] int32 i,

           [1] object obj)

  IL_0000:  nop

  IL_0001:  ldc.i4.s   10

  IL_0003:  stloc.0

  IL_0004:  ldloc.0

  IL_0005:  box        [mscorlib]System.Int32

  IL_000a:  stloc.1

  IL_000b:  ldloc.0

  IL_000c:  box        [mscorlib]System.Int32

  IL_0011:  ldstr      ","

  IL_0016:  ldloc.1

  IL_0017:  unbox.any  [mscorlib]System.Int32

  IL_001c:  box        [mscorlib]System.Int32

  IL_0021:  call       string [mscorlib]System.String::Concat(object,

                                                              object,

                                                              object)

  IL_0026:  call       void [mscorlib]System.Console::WriteLine(string)

  IL_002b:  nop

  IL_002c:  ret

} // end of method sample1::Main   

 查看装箱和拆箱次数最简单的方法就是数一数“box”和“unbox”指令出现的次数。可以看出,代码清单1-2中一共执行了三次装箱和一次拆箱的操作。第一次“object obj=i;”将i装箱;而Console.WriteLine方法用的参数是String类型,String是引用类型,因此,“i+","+(int)obj”中,i需要进行一次装箱(转换成String类型),(int)obj将obj对象拆箱成值类型,而根据WriteLine方法,再次将((int)obj)值类型装箱成引用类型。

装箱和拆箱是有性能损失的,因此在通常情况下要尽可能避免装箱和拆箱的操作。

1.2.2       公共语言规范

CLR集成了很多种语言,并让它们之间可以相互访问,这是因为CLR建立了标准的类型集、元数据、公共执行环境。但由于各种语言间存在着极大的差别(如区分大小写,有的不支持unsigned、操作符重载或者参数可变的方法),所以要想创建这种让别的语言都能访问的程序,自己所用的编程语言只能使用其他语言都支持的那些特性。为了帮助我们更好地做到这一点,Microsoft定义了一个“公共语言规范”(Common Language Specification,CLS)。

CLS定义了CTS的子集,通过定义一组开发人员可以确信在多种语言中都可用的功能来增强和确保语言互用性。CLS还建立了CLS遵从性要求,这帮助你确定你的托管代码是否符合CLS以及一个给定的工具对托管代码(该代码是使用CLS功能的)开发的支持程度。

 如果你的组件在对其他代码(包括派生类)公开的API中只使用了 CLS功能,那么可以保证在任何支持 CLS的编程语言中都可以访问该组件。遵守CLS规则、仅使用CLS所包含功能的组件叫做符合 CLS的组件。

如图1-2所示,CLR/CTS提供了一个组特性,一些语言会提供这些特性的一个较大子集(IL提供全部特性)。而CLS是每种语言必须支持的一个最小特性集合。


图1-2 CTS与CLS的关系

如果一种语言定义了一个类型,并希望在另一种语言中使用该类型,就绝对不能在该类型的公共和受保护的成员中使用CLS外部的任何特性。否则其他编程人员使用其他语言来编写代码时,就可能无法访问该类型的成员。代码清单1-3简单地演示了遵从CLS兼容性的代码编写。

代码清单1-3  CLS兼容性示例

using System;

 //告诉编译器检查CLS相容的特性

 [assembly: CLSCompliant(true)]

 namespace SomeLibrary

{

    //开始出现警告,因为类是公有的

    public sealed class SomeLibraryType

    {

        //警告,返回值不符合CLS

        public UInt32 Abc()

        {

            return 0;

        }

        //警告,仅大小写不同不符合CLS

        public void abc()

        {

        }

        //没有错误,该方法是私有的

        private UInt32 ABC()

        {            return 0;

        }   

}

}

如果将上述代码中SomeLibraryType类的修饰符public去掉的话,一切警告也就消失了,因为这样该类将使用默认修饰符internal,所以在程序集的外部不可见。

注意  不能把类SomeLibraryType的修饰符public改成private、protected或protected internal中的任何一个,因为命名空间中定义的元素无法显式声明为 private、protected 或 protected internal。

关于CLS的详细内容请读者参考MSDN文档及相关资料。

本系列索引博文:《.NET 安全揭秘》系列

附:全书目录

目录
前 言
第一部分 .NET安全基础
第1章 .NET 体系结构/ 2
1.1公共语言运行时/ 2
1.2公共类型系统/ 3
1.2.1CTS基本结构/ 3
1.2.2公共语言规范/ 5
1.3中间语言/ 7
1.3.1托管PE文件/ 7
1.3.2元数据/ 14
1.3.3IL常用指令/ 17
1.3.4IL与代码验证/ 19
1.4基础类库和框架类库/ 19
1.4.1BCL 基本命名空间/ 20
1.4.2.NET Framework 4.0中对BCL的更新/ 21
1.4.3FCL命名空间/ 23
1.5即时编译和预编译/ 23
1.6动态语言运行时/ 25
1.7本章小结/ 26
第2章 程序集与反射/ 27
2.1程序集/ 27
2.1.1模块的操作/ 27
2.1.2程序集概念/ 29
2.1.3强名称程序集/ 31
2.1.4共享程序集/ 33
2.1.5创建多文件程序集  / 34
2.2使用反射操作程序集/ 36
2.2.1反射程序集/ 36
2.2.2加载和卸载程序集/ 39
2.2.3动态创建程序集/ 40
2.3本章小结/ 42
第3章 应用程序域与CLR寄宿/ 44
3.1应用程序域基础/ 44
3.1.1 应用程序域的特点/ 44
3.1.2创建应用程序域/ 45
3.1.3卸载应用程序域/ 45
3.2CLR寄宿/ 48
3.2.1核心组件MSCOREE.DLL/ 48
3.2.2托管exe文件的加载和执行/ 57
3.2.3ASP.NET Web窗体和Web Service / 58
3.3高级宿主控制/ 63
3.3.1托管宿主/ 63
3.3.2托管环境下的线程注入实例/ 65
3.4本章小结/ 66
第二部分  .NET平台级安全性
第4章 代码访问安全性/ 68
4.1代码访问安全性机制/ 68
4.1.1代码访问安全性机制的作用/ 68
4.1.2工作方式/ 70
4.1.3安全性语法/ 73
4.2代码组/ 75
4.2.1对代码组的管理/ 75
4.2.2成员条件/ 81
4.2.3属性/ 85
4.3权限和权限集/ 86
4.3.1权限操作的基本概念/ 86
4.3.2.NET提供的代码访问权限/ 92
4.3.3操作权限集/ 96
4.4代码访问安全性编程实践/ 98
4.4.1实现自定义权限的构造函数/ 99
4.4.2实现属性类/ 102
4.4.3安装到安全策略中/ 103
4.5本章小结/ 104
第5章 基于角色的安全性/ 105
5.1.NET Framework基于角色的安全性/ 105
5.2基于角色的安全性编程实战/ 106
5.3主体和标识/ 110
5.3.1主体对象/ 110
5.3.2标识对象/ 117
5.4安全检查/ 123
5.4.1基于角色的安全性权限对象/ 123
5.4.2命令式安全检查/ 125
5.4.3声明式安全检查/ 127
5.4.4直接访问主体对象/ 128
5.5本章小结/ 129
第三部分 数据安全
第6章 数据加密/ 132
6.1加密技术简介/ 132
6.2对称加密/ 132
6.2.1对称加密原理/ 133
6.2.2对称加密算法/ 134
6.2.3.NET对称加密体系/ 142
6.2.4对称加密实践/ 147
6.3非对称加密/ 152
6.3.1非对称加密原理/ 152
6.3.2非对称加密算法/ 153
6.3.3.NET 非对称加密体系/ 158
6.3.4非对称加密实践/ 161
6.4消息摘要和Hash算法/ 168
6.4.1Hash原理/ 168
6.4.2Hash算法/ 169
6.4.3.NET中的Hash算法/ 175
6.4.4消息摘要编程实例/ 179
6.5数字签名和数字证书/ 182
6.5.1数字签名/ 182
6.5.2使用.NET进行数字签名/ 183
6.5.3数字证书/ 186
6.5.4在.NET中操作数字证书/ 190
6.6本章小结/ 196
第7章 数据存储安全/ 198
7.1磁盘文件安全/ 198
7.1.1文件的基本操作/ 199
7.1.2文件和目录的访问控制/ 209
7.1.3安全删除数据/ 216
7.1.4文件加密/解密/ 218
7.2数据库安全/ 221
7.2.1SQL Server的CLR集成/ 221
7.2.2CLR集成的功能/ 222
7.2.3编译过程/ 223
7.3SQL Server的CLR集成安全性/ 223
7.3.1CLR集成代码访问的安全性/ 223
7.3.2宿主保护特性和CLR集成编程/ 227
7.3.3CLR 集成安全性中的链接/ 228
7.3.4模拟和CLR集成安全性/ 229
7.3.5允许部分可信任的调用方/ 231
7.3.6应用程序域和CLR集成安全性/ 232
7.4本章小结/ 232
第8章 数据通信安全/ 233
8.1SSL原理及应用/ 233
8.1.1SSL协议体系结构/ 233
8.1.2配置HTTPS / 238
8.1.3在.NET开发中处理HTTPS / 250
8.2会话状态安全/ 252
8.2.1会话状态安全基础/ 253
8.2.2会话状态安全攻略/ 262
8.3本章小结/ 263
第四部分 .NET应用安全
第9章 应用程序保护/ 266
9.1反编译/ 266
9.1.1反编译工具Reflector / 266
9.1.2.NET反编译原理/ 269
9.2强名称/ 274
9.2.1使用强名称保护代码完整性/ 275
9.2.2引用强名称签名的程序集/ 280
9.2.3强名称的脆弱性/ 282
9.2.4保护强名称/ 283
9.3代码混淆/ 283
9.3.1名称混淆/ 283
9.3.2流程混淆/ 286
9.3.3语法混淆/ 294
9.4加壳/ 297
9.5本章小结/ 304
第10章 ASP.NET应用安全/ 305
10.1ASP.NET安全性工作原理/ 305
10.1.1ASP.NET安全性体系结构/ 305
10.1.2ASP.NET安全数据流/ 308
10.1.3ASP.NET模拟/ 311
10.1.4ASP.NET身份验证/ 312
10.1.5ASP.NET授权/ 325
10.1.6ASP.NET SQL Server注册工具/ 327
10.2ASP.NET成员资格/ 331
10.2.1ASP.NET成员资格的功能/ 331
10.2.2ASP.NET成员资格类/ 333
10.2.3配置成员资格/ 338
10.2.4成员资格的应用/ 342
10.2.5自定义成员资格提供程序/ 349
10.2.6WCF身份验证服务/ 358
10.3ASP.NET角色管理/ 362
10.3.1ASP.NET角色和访问规则/ 362
10.3.2ASP.NET角色管理类/ 365
10.3.3ASP.NET角色管理提供程序/ 367
10.3.4自定义ASP.NET角色管理提供程序/ 368
10.3.5WCF角色服务/ 370
10.4受保护配置/ 371
10.4.1管理受保护配置/ 371
10.4.2受保护配置提供程序/ 373
10.4.3RSA密钥容器/ 379
10.5本章小结/ 381
第11章 WCF应用安全/ 382
11.1WCF安全基本概念/ 382
11.1.1绑定/ 383
11.1.2安全模式/ 394
11.1.3身份验证凭据/ 396
11.1.4保护级别/ 398
11.1.5授权/ 400
11.1.6模拟/ 400
11.2WCF局域网安全/ 400
11.2.1NetTcpBinding Transport安全模式/ 401
11.2.2NetTcpBinding Message安全模式/ 422
11.2.3局域网绑定安全/ 429
11.2.4局域网环境下的授权策略/ 434
11.3WCF互联网安全/ 444
11.3.1BasicHttpBinding示例/ 445
11.3.2BasicHttpBinding安全项/ 449
11.3.3BasicHttpBinding安全应用/ 454
11.3.4WsHttpBinding简介/ 477
11.4WCF安全认证流程/ 478
11.5本章小结/ 479
第12章 WPF应用安全/ 480
12.1WPF应用程序/ 480
12.1.1WPF独立应用程序/ 480
12.1.2WPF浏览器应用程序/ 483
12.2WPF应用程序安全性/ 485
12.2.1安全导航/ 486
12.2.2Web浏览安全设置/ 487
12.2.3安全沙箱/ 500
12.2.4部分信任安全/ 501
12.2.5部分信任安全策略/ 506
12.2.6松散XAML文件的沙箱行为/ 510
12.3部分受信任代码的库调用/ 511
12.4本章小结/ 513
第13章 Silverlight应用安全/ 514
13.1Silverlight运行机制 / 514
13.1.1Silverlight运行环境/ 515
13.1.2Silverlight架构/ 516
13.1.3CoreCLR安全模型/ 518
13.2Silverlight运行在沙箱中/ 519
13.3透明模型/ 524
13.3.1透明代码的调用/ 525
13.3.2透明代码、SafeCritical代码和关键代码的比较/ 527
13.3.3Silverlight透明模型的优势/ 528
13.4网络通信/ 529
13.4.1基本HTTP功能/ 529
13.4.2HTTP调用/ 530
13.4.3跨域通信/ 532
13.4.4网络安全访问限制/ 536
13.4.5URL访问限制/ 548
13.5Silverlight安全策略/ 550
13.5.1XSS问题/ 550
13.5.2代码隔离/ 551
13.5.3用户数据保护/ 554
13.5.4保护xap文件/ 558
13.6本章小结/ 559
第14章 Open XML应用安全/ 561
14.1Open XML规范/ 561
14.1.1文档格式/ 561
14.1.2开放打包协定/ 563
14.1.3Open XML标记语言/ 566
14.2Open XML开发基础 / 573
14.2.1操作ZIP / 574
14.2.2操作XML / 577
14.2.3Open XML API / 582
14.3Open XML应用安全/ 586
14.3.1宏安全/ 586
14.3.2OLE机制/ 587
14.3.3隐藏数据/ 590
14.3.4文档校验/ 592
14.3.5数字签名/ 593
14.4本章小结/ 599
第五部分 高级扩展
第15章 WIF开发框架/ 602
15.1WIF基本原理/ 602
15.1.1标识库/ 603
15.1.2基于声明的标识模型/ 604
15.1.3安全令牌服务/ 609
15.1.4联合身份验证实例/ 614
15.1.5WIF的功能/ 616
15.2WIF编程模型/ 617
15.2.1WIF编程模型的优势/ 617
15.2.2WIF基本行为/ 618
15.2.3IClaimsIdentity和IClaimsPrincipal / 619
15.3WIF与ASP.NET实践/ 620
15.3.1准备工作/ 620
15.3.2将认证外包给STS / 622
15.3.3基本编程概念/ 625
15.4本章小结/ 638
第16章 微软云安全/ 639
16.1云计算/ 639
16.1.1云计算的演进/ 639
16.1.2云计算的特点/ 640
16.2微软的云计算/ 642
16.2.1Windows Azure平台的架构/ 643
16.2.2应用模式/ 644
16.3Windows Azure安全/ 645
16.3.1安全模式/ 645
16.3.2云安全设计/ 648
16.3.3开发生命周期安全/ 654
16.3.4服务的运营方式/ 654
16.4本章小结/ 656

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
楼主 博客的头像 和  《.NET 安全揭秘》的封面。。。。虽然你尽力模拟。。。但还是  差距悬殊啊。。。
2012-5-23 08:44
0
雪    币: 107
活跃值: (409)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写了这么多???支持啊...
2012-5-23 09:07
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
两者本来没什么关系,哈哈
2012-5-23 12:46
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢,继续发布中
2012-5-23 19:50
0
雪    币: 10643
活跃值: (2339)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这本书 初步感觉实战性不是很强
2012-5-24 07:53
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你必须会编程
2012-5-24 13:25
0
游客
登录 | 注册 方可回帖
返回
//