WEB开发网
开发学院软件开发VC Security Briefs...小心完全信任的代码 阅读

Security Briefs...小心完全信任的代码

 2006-07-20 11:40:01 来源:WEB开发网   
核心提示: // evilcode.csusing System.Security.Permissions;[assembly: SecurityPermission(SecurityAction.RequestMinimum,Flags=SecurityPermissionFlag.SkipVeri
// evilcode.cs
using System.Security.Permissions;
[assembly: SecurityPermission(
SecurityAction.RequestMinimum,
Flags=SecurityPermissionFlag.
SkipVerification)]
// your evil code goes here

你甚至可以不用知会 CLR 而在程序集中使用这个许可请求。如果用 /unsafe 选项编译 C# 代码,编译器会悄悄添加这个许可请求。如果用托管 C++ 代码生成一个程序集,默认情况下也会这样,虽然在下一个 C# 版本中,这种状况将会 被新的编译选项改变,代号为“Whidbey”。当 CLR 用 SkipVerification 请求成功加载某个程序集时,它会按照在 JIT 编译期间所发生的那样跳过类型安全检查。Framework Class Library(FCL)使用这个特性,即便是 MSCORLIB.DLL 这种核心的 .NET Framework 的程序集都在使用这种许可请求。有句老话说得好,既然有所得,总要付出代价 。

你必须做出决定,哪个程序集可以忽略许可请求,哪些不能。首选项是通过 .NET 得安全策略来实现。任何以 FullTrust 方式运行的程序集,在默认情况下包含 .NET Framework 自己以及安装在本地硬盘上的程序集都允许跳过检查的请求。从网络上下载的 程序集在默认情况下其跳过安全检查的请求将被拒绝。

不知道你怎么想,但我知道了这些后,肯定会尽量使我的每个程序集以部分信任方式运行。

私有方法真的就私有吗?

在我的上一个例子中,演示了完全信任代码如何跳过代码检查并用指针运算读写任何类的私有数据成员变量。其实你没必要非得用指针,使用反射(reflection)可以完成同样的事情(参见 Figure 1)。

当另一个类试图调用,甚至是通过反射调用私有方法时,CLR 的确会以抛出异常的方式来保护它们。 真是这样吗?再说一遍,针对这种搞笑的事情,唯一能保护你的类的方法是通过 .NET 的安全策略。在这种情况下,重要的许可是 ReflectionPermission。完全信任代码要具备这个许可,必须要反射私有方法。

上一页  1 2 3 4 5 6 7  下一页

Tags:Security Briefs 小心

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接