数学建模社区-数学中国

标题: socket连接多层程序安全性简述 - 呼叫 [打印本页]

作者: 韩冰    时间: 2005-1-26 01:09
标题: socket连接多层程序安全性简述 - 呼叫

1 H0 K8 R J6 ?! _; f9 D

2. 呼叫 对连接其间每次呼叫进行安全检查

# }1 r7 b# ^- S/ l

5 g8 d/ c' O. @- {0 K2 z

对应于MIDAS中其实就是每次取、改数据时对用户进行检查

' U1 `/ _. L7 G6 U0 W2 D! P' B% U8 ^

因为所有客户端都是通过IAppServer接口对服务器进行操作

" Z3 ^" e- l8 c$ v. X. ?, J% q

因此一劳永逸的方法是自己提供IAppServer接口的实现,

" v8 ]; Z. P/ O n1 E

考察一个实例

; @# W, y6 J" [. c6 J( `

% g. z6 _# p4 N

class ATL_NO_VTABLE TLoginServerImpl

9 M( U( ^- U& f% i' q$ B/ c- R

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

: i0 B* ^) O. Q' X

Server),

! P& d! }% v0 i4 V. X8 {- v% h

public IConnectionPointContainerImpl<TLoginServerImpl>,

$ ~ R, g! `$ C8 N/ x( R% L2 Y

public TEvents_LoginServer<TLoginServerImpl>

4 H m1 x- G- Z1 C& {( @7 C

{

3 }8 l& c5 U4 F( j% ]+ G4 I+ D

...

8 t5 h3 j1 S' W# T& G. B8 ]

}

& `% d' |/ M- g p+ ~: z

BCB中是用REMOTEDATAMODULE_IMPL宏封装了IAppServer实现的定义

1 K5 d& y0 `4 }/ G4 U0 z

2 Y5 K& t0 ^1 Q0 y; l- K( i

#define REMOTEDATAMODULE_IMPL(cppClass, CoClass, VclClass, intf) \

. F7 H% h' L* _4 ]3 k- v U

public CComObjectRootEx<CComObjectThreadModel>, \

* v' Q/ o, [8 Y2 i- c

public CComCoClass<cppClass, &CLSID_##CoClass>, \

& j/ E+ w. D* j, C4 ?

public IAppServerImpl<VclClass, cppClass, intf, &IID_##intf, \

9 Z: h2 h0 e4 D" C2 N

LIBID_OF_##CoClass>

2 h1 Q& W; z, ^# C6 v. K" K0 Y

7 B3 {, C8 Z7 h1 _, u) v; r* D

这里的IAppServerImpl是BCB用来实现IAppServer的模板类

4 `" D8 }. ~; a; S3 [ E3 s' d

而IAppServerImpl的实现代码在atlvcl.h文件中,很简洁

* V! e: q; T& m, E

完全可以通过实现自己的相应模板类来实现在IAppServer

* ^. K; J$ p" m a7 s$ @) |

一级实现用户身份检验功能。这样做效率最高,但比较麻烦

$ O8 P7 O, x' ^3 J

有兴趣的朋友可以自己下去试试,这里不再详细说明

4 l2 c C4 V% Z1 t

0 F( H! O+ h& ~; t7 R0 Y& K9 c' }* h

注意基本上所有的IAppServer方法都提供了一个OleVariant& OwnerData

! U' a3 c" u9 @. {, g4 o

参数,可以通过此参数取得足够的用户信息,用以校验

' U4 L% g5 |6 N; [) Y

比如偶比较喜欢给客户一个实时生成的SessionID(GUID类型)

+ D7 k7 D1 v0 ?! u, \4 Y( ]

然后将之与服务器端已知的特定用户信息一起hash一把,呵呵

2 _- q8 m: [6 k$ ], K/ y2 {

. ?+ F% `: ^) F- U0 R1 R

次一级的方法是利用现有的VCL结构提供的事件来解决

/ t8 T' J+ r0 u9 \" ?

不过这样做就有点麻烦了,呵呵,你必须在所有需要有

. a3 q; f5 K+ q$ u

安全检验功能的TDatasetProvider的基本上所有BeforeXXX

0 ? _5 E4 R! B" k, R

事件里面增加相应的安全检验功能,如

* _$ g# Z- t$ S0 f2 y

if(!IsLogin(OwnerData))

, n4 U7 X- S4 p& M

{

' b2 J. l/ H/ e

throw Exception("Please login first!");

5 L/ _/ l- G' D/ U" d) F

}

" X* D5 ?. k; D9 U8 t6 H. ~: t

出错直接抛出一个异常即可,系统会自动捕获返回给客户端

3 d- _: J0 p$ i/ ?% k9 I0 a+ c

好在大部分的beforeXXX事件都是TRemoteEvent类型,可以共用一段代码

) T! y: J0 f0 }. K# R

而在客户端需要做的事情就是在合适的时刻login/logout

- D$ e7 O: S" M

然后在相应的TClientDataSet::BeforeXXX事件中将

z& K: T7 c# I7 E" C+ S# Z! }. j

OleVariant &OwnerData设置成相应的数据

' o/ \* @! F/ x: N

- n0 F# s1 j* o

一种变通的办法可以重载你的TSocketConnection类

+ H B/ x @( N( {( |

将每次对IAppServer接口的调用中的OwnerData加一个

+ W6 m) M, z. o* o3 Q6 j

自己的鉴定信息头,然后在服务器端剥离,呵呵

/ ]6 s6 f+ h# V& P. O9 ^

这个方法有兴趣自己试试好了






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5