数学建模社区-数学中国

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

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

( ?) ` \: w" V1 n0 m! q

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

" e" O) C$ K! o9 ?4 W8 ]+ Z# m

0 @- a; N& q8 D# w$ A0 E

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

! N X' n& e$ `& u

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

, e/ s* ?6 ^# `9 @/ i0 I

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

2 q/ o" b* O/ X6 o9 d

考察一个实例

/ I/ N/ ]. L- D) e/ F4 V" p

- z. i5 {( `; {' P8 h. M$ v

class ATL_NO_VTABLE TLoginServerImpl

1 g5 q8 T2 V( D* o/ ~6 G/ M

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

& k% p% W! p: Y$ i i

Server),

3 S W, u! V* c; M& R

public IConnectionPointContainerImpl<TLoginServerImpl>,

. h5 v- h2 O3 V9 l9 s

public TEvents_LoginServer<TLoginServerImpl>

2 u* l5 w2 D& U: q5 L3 E1 t

{

0 F9 h) W! \1 J) t- Z* ]) F( h

...

9 H3 J" U3 }$ {+ o

}

$ P! r! d* D% E0 V) L( m

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

8 x6 D j' F+ z0 I3 Y7 p: ~8 @

( y5 M/ B4 L8 f4 `1 @9 k0 B8 S

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

0 O2 z# B2 c( ?" C+ F

public CComObjectRootEx<CComObjectThreadModel>, \

" y; p C! P0 a& i. N3 N2 u

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

; c+ e* P$ I5 [+ ]! D! I1 n

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

4 y( h: w6 H8 h6 D [& r7 k

LIBID_OF_##CoClass>

; o9 v# {0 y' k3 `: g4 `

H9 t' j0 E$ e" S9 U3 p' p3 k; ?

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

0 G c. ~6 c6 l1 q

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

+ l/ N K8 s4 |# ?$ E7 l( ]! D

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

$ g) l" ]2 D0 G- T8 r

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

; t: [, c8 G% N, M9 x' ~6 o1 a

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

4 d3 Q0 ]. o9 R6 }' v f* S

5 P* [, J% Q+ ]2 Z

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

+ L4 T7 N T, B3 E1 q9 E# o6 c0 |

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

! o" x1 X$ N/ ?1 m

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

( O3 \) ^; `9 {! {

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

2 S7 L! {3 |1 W4 x) a0 N! V/ u

( m3 L" v: G) ]- |' `

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

9 {/ ?1 R p: s+ H

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

+ l! k2 h9 o8 Z- r5 @

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

. T9 g. i+ g- P

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

' X1 E% Y0 x8 \0 N0 `

if(!IsLogin(OwnerData))

( q" w O+ f+ }. D, p

{

% y- J4 j' _5 W. G1 ?

throw Exception("Please login first!");

" }8 l8 D! a' q5 K6 o9 A% e0 N O

}

9 c) S- B9 ?, _- X2 D4 b; _

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

& ^. ~% K0 w! A, v/ J5 b- i

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

# I0 V( ?% ~1 K3 u/ [$ }( [) \- ?3 c, y

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

8 O$ p" V. o/ h2 V9 l+ W0 l

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

1 v6 k' ~% i7 E( X, r

OleVariant &OwnerData设置成相应的数据

) z; B7 i, q# g

* I( j& R6 f# ]2 H

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

: k R& v" f: F; ~+ F

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

1 C' }) h9 w6 V! O

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

0 V+ I6 Q; M" ?4 s! a( R

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






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