QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2350|回复: 0
打印 上一主题 下一主题

socket连接多层程序安全性简述 - 呼叫

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 01:09 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

1 J/ M( U6 w/ D# o; ^8 H

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

1 ~' O% H! V; ^ P# f

; P9 V4 i. r/ o1 b- S( _" c/ A2 Y

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

2 T6 p6 r7 L2 U. T% U; a

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

' a! ~! ~$ c" [+ ^/ y; o

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

7 T; r! ?$ C2 J; l& M) j: f6 {9 R/ e

考察一个实例

0 Z& V+ ^7 I/ T! _3 Y0 A

% Q* X9 k& {+ a- Z

class ATL_NO_VTABLE TLoginServerImpl

$ T. q1 S! L; S

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

5 H6 L f4 P* C- J0 ?, t

Server),

# K; v5 [ x* t+ y# ]% t3 P) y' S, g

public IConnectionPointContainerImpl<TLoginServerImpl>,

0 I+ V+ m. O0 a, h, Y2 @

public TEvents_LoginServer<TLoginServerImpl>

" H, {- w! {6 }1 o8 } V8 |3 T

{

4 v. }. v* J1 e$ V9 d

...

; v) j3 N; g' G8 P0 n8 i

}

+ |7 T7 }% s( M# c- F7 E

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

- i$ p2 q( N, k& I6 }& z0 r# _

# @! A9 ^2 h1 T* A

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

- {8 T* Y& t8 n- C* h: c

public CComObjectRootEx<CComObjectThreadModel>, \

8 i$ q. e3 y/ I# I& F

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

, Z$ A3 ~. R# e$ D4 S9 c5 E+ T) l

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

2 Z( ^3 T5 O" R2 g; G3 ^

LIBID_OF_##CoClass>

* u: A$ I) @1 E }7 N

+ z) j- g0 Q: h# y9 J9 z4 c: c

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

; r5 W$ ^! B2 D/ \& {8 c6 s

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

) h4 \) V) b4 a" \8 f. H7 Q

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

. w/ b, I+ |% l! ]6 G

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

$ y& j* F- E& ~2 U3 }1 Q

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

' [5 z2 I4 T7 e/ C1 h. k

! G3 Q5 v7 P. E* |: I

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

. ^7 T2 P/ n# c; S- X! s1 B

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

! a( H3 d5 S4 e8 ^4 ~

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

2 v \" X' A$ ~' y( E9 s

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

" J4 v; S0 Y5 j) V

) V( J& ~/ e3 ^! [& `9 N8 Y! t

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

$ Q4 h& d1 `" c) B

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

3 s$ j1 n; c" _: A9 Z

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

) H3 m1 D: E' a& ^" \% j

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

, n1 Z7 K( h7 \, I9 S

if(!IsLogin(OwnerData))

9 g9 I3 n. [: {0 Z% G

{

. D0 P8 G4 H; }# t1 x0 T9 H3 M

throw Exception("Please login first!");

; p7 T1 f* i/ k7 R# b" y8 r3 t0 V

}

7 i' P8 S- ]9 t8 a

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

' a% g( m! P e

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

. F# Q4 z" g& s6 K, @7 ]

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

; ?/ d' t" w5 o8 M( E

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

) f5 ]1 ?, d! |( i* t% L

OleVariant &OwnerData设置成相应的数据

5 E( @" f- Z5 N4 K8 K

1 i5 e1 I' \4 u* q0 n3 z8 ?

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

& `0 O2 H+ r/ n" N

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

2 r- r6 k: ]7 W6 l

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

. x7 h% R/ g$ b0 _6 W0 d8 b8 p

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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-13 06:42 , Processed in 0.563602 second(s), 51 queries .

回顶部