发信人: lofe (〖感激生活〗), 信区: BorlandDev
标  题: socket连接多层程序安全性简述 - 连接
发信站: 哈工大紫丁香 (2000年12月07日17:58:57 星期四), 站内信件

发信人: flier (小海 //爱喝可乐^_^), 信区: C++Builder
标  题: socket连接多层程序安全性简述 - 连接
发信站: BBS 水木清华站 (Thu Nov 30 02:35:40 2000)

前面hawkfly提到的在多层编程中,服务器端安全性验证的问题
在以socket方式实现MIDAS时尤为明显,DCOM/CORBA都有现成的
安全管理功能,而socket方式在这方面比较薄弱,没有现成的解决方案
现就我以前对MIDAS编程的理解,做一个简要的介绍,
以后有时间精力再详细举例说明 :)

win2k中dcom的安全级别有7种,其中
最低的“无”安全检查暂且不论 :)
默认的“身份验证”服务方式几句话也说不清,
先放到一边,看看剩下的5种

1.连接,仅对初始连接进行安全检查

  因为tcp/ip是稳固的连接,因此每个连接,也就是每个RemoteDataModule
  实例检测一次即可,实现方法很多,这里简要介绍一种最简单的
  可以在服务器端的TypeLibrary里面为你的服务器接口增加若干个方法,如
 interface ILoginServer: IAppServer
{
  [
  [
  id(0x00000001)
  ]
  HRESULT _stdcall Login( void );
  [
  id(0x00000002)
  ]
  HRESULT _stdcall Logout( void );
};
  在方法中实现你的客户身份校验,而在校验之前,通过把RDM上所有的
TDataSetProvider
  的Exported属性关掉即可让客户端无法看到服务器端的provider
  因为客户端实际上是在连接服务器成功后通过服务器之IAppServer接口访问
  所有的Provider,如IAppServer::AS_GetProviderNames可以取得
  服务器端所有exported的IProvider接口名称,而所有数据的取得、修改
  都是通过相应的ProviderName来指定的,如
virtual HRESULT __safecall AS_GetRecords(const WideString: ProviderName,
 in
t Count, int &RecsOut, int Options, const WideString: CommandText, 
OleVarian
t &Params, OleVariant: &OwnerData, OleVariant &GetRecords_result) = 0 ;

  取得数据方法的第一个参数就是你需要操作的数据集名称……
  如果你把服务器RDM上所有的TDataSetProvider::Exported关掉,
  则客户端看不到任何Provider,也无法通过其ProviderName取得数据
  例如我在服务器端的RDM类中加入
class TLoginServer : public TCRemoteDataModule
class TLoginServer : public TCRemoteDataModule
{
...
private:      // User declarations
  bool FLogin;
  void __fastcall SetLogin(bool value);
  bool __fastcall IsLogin(OleVariant &OwnerData);
...
__published:
  __property bool Login = { read = FLogin, write = SetLogin };
};
在RDM实现类中
class ATL_NO_VTABLE TLoginServerImpl: 。。。
{
// ILoginServer
protected:
  STDMETHOD(Login());
  STDMETHOD(Logout());
};
然后简单实现之
__fastcall TLoginServer::TLoginServer(TComponent* Owner)
 : TCRemoteDataModule(Owner), FLogin(false)
{
{
}
//----------------------------------------------------------------------
-----
void __fastcall TLoginServer::SetLogin(bool value)
{
  if(FLogin != value)
  {
    FLogin = value;
    dspAnimals->Exported = FLogin;
  }
}
//----------------------------------------------------------------------
-----
STDMETHODIMP TLoginServerImpl::Login()
{
  m_DataModule->Login = true;
  return S_OK;
}
//----------------------------------------------------------------------
-----
STDMETHODIMP TLoginServerImpl::Logout()
{
  m_DataModule->Login = false;
  return S_FALSE;
}
}
//----------------------------------------------------------------------
-----
bool __fastcall TLoginServer::IsLogin(OleVariant &OwnerData)
{
  return FLogin;
}
easy :) 这样除非你的客户端成功调用Login方法,否则他是无法使用
dspAnimals这个数据集Provider的,成功调用后手工打开的数据集使用完全相同

比如客户端可以用如下代码
  IDispatch *dispAppServer = (IDispatch*)(DM->Connection->AppServer);
  ILoginServerDisp dispLoginServer = (ILoginServer *)dispAppServer;
  dispLoginServer.Login();
  DM->cdsAnimals->Open();
实现注册,并且打开相应数据集……

因为大多数的三层程序对安全性要求并不高,因此这样的安全检测对
绝大多数程序应该足以……:)

待续……
--
 .  生命的意义在于   /\   ____\ /\_ \   /\_\                            
 .      希望         \ \  \___/_\/\ \   \/_/__     __    _ _★          
 .      工作          \ \   ____\\ \ \    /\  \  /'__`\ /\`'_\          
 .    爱你的人         \ \  \___/ \ \ \___\ \  \/\  __//\ \ \/          
 .   和你爱的人         \ \___\    \ \_____\ \__\ \____\ \ \_\          
 .      ……             \/___/     \/_____/\/__/\/____/  \/_/ @126.com 


※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.114.32.18]

--
不知道GRE,PPP,PPTP是什么?搜索MSDN!

MSDN真的很好,有空就去看看,你总会发现许多找不到的多东西。

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: malacs.hit.edu.cn]
※ 修改:·lofe 於 12月07日17:59:27 修改本文·[FROM: malacs.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.005毫秒