数学建模社区-数学中国

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

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

+ k9 L. V5 o. t& t' L* c+ |

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

. @8 A' M/ J/ z, [

- W6 e7 m0 j) }4 W2 A R3 H

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

K* z/ `. v+ _" D& H

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

! n/ y9 ^0 e8 y3 b% y

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

: M- F4 ^9 I: d2 ~3 p/ Q8 r

考察一个实例

! U3 Y# s4 Z) j3 N z! w0 A3 z4 t

, n0 c% a$ \# Q$ }( V: ^/ G% p/ \

class ATL_NO_VTABLE TLoginServerImpl

4 T+ [3 C1 Q2 v5 w7 L

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

- e7 X m9 ] s0 V

Server),

9 p! x5 a# ^2 i s, k- u% i

public IConnectionPointContainerImpl<TLoginServerImpl>,

. h9 |. _/ e5 ^: O6 Z$ {

public TEvents_LoginServer<TLoginServerImpl>

3 E T. F/ E4 G; f! v% h1 n! W

{

. g6 F3 U% {7 t1 D$ b; m8 K

...

+ q/ H6 u: A* E

}

* U# L3 K; F+ c

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

! v4 B0 u! n5 f* k( W

8 C" _ C# J& D- {- B

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

* M b% b& D0 h5 w0 v: a! _

public CComObjectRootEx<CComObjectThreadModel>, \

1 O. ]0 F* \1 F, \) a/ S

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

$ T+ x0 ]; g, ~5 h# V& a: @5 y

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

8 a& [1 q7 D" Z0 B1 b! Y

LIBID_OF_##CoClass>

: {& |& ?" R4 \) _; O @0 z# ]9 p

7 t+ _2 _ z/ K7 Z8 a/ Y. c# ~

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

/ d2 m& q: ?1 {3 |) b, T0 e

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

0 n/ ]: b7 d9 O7 p

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

1 _! O' h0 U4 ^1 M0 j$ O- Z

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

9 g1 X d+ O# h2 T6 K! m

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

8 g! C7 W3 c4 Y9 {. L

0 X1 B' ?- Q) C" U

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

2 j2 q7 J9 H: \4 E3 ] F$ l% b

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

& I _5 c3 Y1 R0 U

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

3 ~- \: E: Q- q9 O2 J# i6 d

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

* W! u) a5 n7 N) _( N6 z9 g1 A

& z5 Q6 l5 S$ e1 q5 i

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

) K. b3 R* N9 _& h# \, K

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

( z1 ^3 H' F5 a

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

" f* n7 X& K, P$ X: L# Y

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

3 n& q3 t1 {( _! b8 I {3 H

if(!IsLogin(OwnerData))

" j- V3 }9 Y( Z0 f: Y s

{

' R5 v+ J: y& e! u" E7 r$ ]5 _7 P9 S$ @

throw Exception("Please login first!");

3 z2 s' {6 k$ ^, ^: A

}

! M/ J# Y8 U. D9 u# O' N

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

2 x6 }3 O2 o/ s) [( v

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

# m n' e% W" G( [! r( h

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

. \ H; M% g2 W z* f2 s5 Y

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

$ ?5 O5 {4 ~/ C+ j/ K

OleVariant &OwnerData设置成相应的数据

' f& \* x0 @3 H! J% P

" T: e& C. V0 v1 N' C

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

! {- {. J8 J2 y/ u, E; K3 L

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

, o3 N" y& c3 a% f

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

0 d$ F3 G. y: K& R: g& l# Y

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






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