Author:zfive5
Email :zfive5@yahoo.com.cn
刚看过《.NET Remoting编程简介 》,文中Remote客户端程序直接使用第一步生成的库是错误的做法,这样相当把类的实现暴露给使用者,用ildasm.exe打开看看吧!看看方法的实现逻辑真的一览无余,连块遮羞布都没有......作为入门级的文章可以这样直接使用,但要注明这里的弊端。不要让你的读者忽略这点!为他们将来的remoting系统安全种下苦果!
C#代码:
using System;
namespace TestDll
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class zf5:System.MarshalByRefObject
{
public zf5()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public int Add(int a,int b)
{
return a+b;
}
}
}
ildasm.exe 下的反编译的MSIL代码:
.method public hidebysig instance int32 Add(int32 a,
int32 b) cil managed
{
// 代码大小 8 (0x8)
.maxstack 2
.locals init ([0] int32 CS$00000003$00000000)
IL_0000: ldarg.1
IL_0001: ldarg.2
IL_0002: add
IL_0003: stloc.0
IL_0004: br.s IL_0006
IL_0006: ldloc.0
IL_0007: ret
} // end of method zf5::Add
int32 zf5::Add(int32 a,int32 b)实现代码一览无余!如果这是一段加密或认证代码,
你看怎么办?
现在沉思中......
MSDN中关于它是如下这样说的:
由于客户端需要远程类型的类型信息,因此简单地将远程类型库部署在客户端来充当元数据库通常是最简单的方法。然而,许多情况下,您不希望任何客户端具有对该类型实现的访问权。有若干种方法可以解决此问题:
1.按照单独客户端主题中所述使用 Soapsuds 工具 (Soapsuds.exe) 创建一个单独客户端。这仅适用于 HttpChannel 对象。
2.在客户端部署一个仅包含元数据的程序集(此程序集与服务器程序集具有相同的名称和类型信息),并禁用版本检查或者将版本留为空白。
3.在另一个库中声明一个接口,并且将该库部署到客户端。发布一个实现该接口的服务器类;客户端将能够通过获取该类实现的接口的代理来使用该类。
注意 客户端将必须调用 Activator.GetObject 方法来获得代理。
调用 new(在 Visual Basic 中为 New)将引发编译时错误;无法创建接口的实例。
4.为真实类生成一个可远程处理的包装类。发布和部署包装库。客户端将不具有对真实对象的访问权。