数学建模社区-数学中国

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

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

$ @* L$ C) c3 _3 I+ y$ v& j) T

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

8 A" E, ^/ n; G/ O: k$ Z6 p: R

" Y1 _5 B; i5 ]3 b! b& d$ p) n

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

0 X+ Z( [+ P& _" \

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

" w6 c7 `5 T( f# O; K- w% P1 a

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

; O" C8 ^5 d5 n- a" A. ]

考察一个实例

$ J$ z& a% w* `% O

3 T6 A0 o% f( s) W5 h; \6 |

class ATL_NO_VTABLE TLoginServerImpl

6 Z3 I$ u. U6 O

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

1 k3 [/ g! P$ Q- A; m

Server),

9 Z U' K) S! ^4 k" Q

public IConnectionPointContainerImpl<TLoginServerImpl>,

1 I0 o% _. Z$ o' h! }1 V8 b8 F3 Y

public TEvents_LoginServer<TLoginServerImpl>

" n* R5 Y# V- L/ A2 ~$ \5 ]

{

% n; o7 M5 r8 F( R

...

( n8 Q8 @8 a: Z" c+ Y; ~

}

( C% s# p' X1 i& X! b- E' S$ f

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

" |7 U/ u+ T% m. M* p

3 @$ |# r& i3 _ [5 Y8 U [

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

+ T# I2 K' b+ L8 f F, J

public CComObjectRootEx<CComObjectThreadModel>, \

^5 f* v/ x% t# K

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

- u" c5 r8 J( ?. z6 M" u

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

+ o- q9 I- @( Q; }+ ~- d- `

LIBID_OF_##CoClass>

) @+ b1 U& r7 `

2 ?# G+ u) h1 O/ C$ G

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

3 c" i6 U m/ T/ n2 c& N

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

0 k$ k4 ]# B1 f" L, x! W

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

1 w3 }) L- O N" o$ J3 A9 P4 `

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

# } ^& W& t* _2 G# e- c5 q

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

0 Y5 {, W" U" _

7 c7 H3 `; a/ [. B6 z0 y) n |$ h

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

5 K4 t" g( F; ^# g

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

; Q7 d$ x9 Y% n' V

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

2 i/ I& x, B; R& ]7 y/ R/ a# o7 N. H

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

) a4 q& D) y/ A

( A2 m" |% i/ A2 [. o$ n. v; t

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

O+ V* R' z7 [* s+ H2 A

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

# D$ A7 g. g: h8 R

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

' I% y2 q- L/ f' r

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

, c8 R! l) J: ~& ?

if(!IsLogin(OwnerData))

) I" m6 l' r3 t; M. t

{

1 ]/ o! y% L8 F

throw Exception("Please login first!");

6 `) [$ i0 t3 U" q% r

}

1 \0 C8 w& A5 c# l Z5 C* c; P2 e- F

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

+ T8 J2 Q# \. m- p

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

% }, y7 X3 o: {1 c* S- M

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

) o$ V! A( J) o9 [3 j

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

' K0 _3 Y2 ?$ j2 d) ?

OleVariant &OwnerData设置成相应的数据

0 \" v: j5 g5 M$ A

, p! k% H# M/ R/ R

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

$ F/ r- b4 K* ~( o& S

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

0 g) q4 y6 Y: Y* B. o6 h

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

8 l3 ]6 ]2 d0 E3 b; B

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






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