QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

3 i; M$ O' n4 S2 w2 Y0 u1 f

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

7 Q3 Z8 W7 `- ?' s

* S# q+ q1 f; O9 C4 v/ N

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

v# P# m- g l A3 e

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

7 l. R5 J6 \: v$ t6 y5 V+ k

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

. e0 O' g; w9 a& m$ {. E! u7 |

考察一个实例

& s1 P0 a- [) t& S) d

0 @' E9 l7 o/ v6 k0 Z @

class ATL_NO_VTABLE TLoginServerImpl

: ?- b2 p* f% X" f2 g+ |& b

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

, j5 ~& P( A( G

Server),

; E6 ?' ? p/ j# r

public IConnectionPointContainerImpl<TLoginServerImpl>,

% S! p$ T: L! b% R D9 O

public TEvents_LoginServer<TLoginServerImpl>

* B3 a1 D; j y) `" |- g+ [

{

9 }9 b# y/ s- t F& H

...

$ Q9 i2 A& @. r

}

C% d0 K1 Q9 D" K7 \

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

7 d) D# |+ s5 F

" N0 [+ E" R3 J

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

- Y" v" \, Z% A

public CComObjectRootEx<CComObjectThreadModel>, \

R; K: `/ T# H

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

4 U) Z- f4 q0 f7 M' N' c+ N) Z. T8 ?

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

& N+ b" `2 f3 N

LIBID_OF_##CoClass>

" |* Z5 @. V- e; D

' I3 K/ b& z$ o. ?8 [4 h" |

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

; ]" P2 J) x& S9 u V

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

+ i7 x* `9 c2 [, A; z% n6 h8 ^

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

, N+ a0 }5 Q5 P+ a/ E

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

1 I8 a& a7 v1 \

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

N8 [' O2 T( q3 E

& K! u/ T/ p& t" i6 z4 n# v- @

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

) H+ S( P% N) j$ {% B- o

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

: F! F) x4 P% }2 `) @5 I

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

- \, b, F4 V. r e

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

/ {0 n" u$ ^* H% {, D, i! k* i

& S; P" d, o2 }6 v7 G7 _* P

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

9 `% y5 A$ i# ?6 }- M# c

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

) h' W+ s+ l/ i$ o0 \- v: R# a

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

; B! u$ J" i0 e7 Y

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

# _% B a. X0 t5 @ h

if(!IsLogin(OwnerData))

* e' p" l- f. \8 V/ {

{

) [ k; f2 A( ], H

throw Exception("Please login first!");

* C" N- z8 Y/ u+ \; m0 ]

}

! k, s7 B" t* q+ l. z; Q+ H I" ]

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

- T0 T* R! f% ^" S

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

$ ?. B/ k0 x# }# }9 N% @( \

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

7 s! q6 [( B( b) t

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

0 f) Y/ k& p+ f3 a" H( v" Q

OleVariant &OwnerData设置成相应的数据

2 |& [, c' J1 X% O+ V, V

1 ]/ T1 I0 p- @

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

3 P/ o; D8 U9 ?! y1 Z! { c, v" C/ F

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

* ~) G0 ^2 D" w: n ~6 W

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

( z5 z: L4 k9 C0 ~

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

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-10-18 03:29 , Processed in 2.828486 second(s), 51 queries .

回顶部