QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

+ \" h5 I! E: h8 X2 K

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

, A4 ^9 I9 p) n9 r* S! u' i

, u6 F) r" r" d) V" Q& l

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

0 g) z3 |- V- o' I$ C4 o- i. K

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

( @+ C2 T7 R0 a) |+ R. A8 M+ |

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

1 j1 R4 f- j$ Y( U4 C. Y) @7 Z2 k. [! `

考察一个实例

2 P0 l% u: J: T. c8 {" e

: |- b: f# J7 I) o6 ?

class ATL_NO_VTABLE TLoginServerImpl

, ]5 h' O' w0 f4 {/ k$ X8 }. Q

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

6 G9 S g! |! y, g+ s8 l$ u

Server),

! v9 b* }; r1 {$ O

public IConnectionPointContainerImpl<TLoginServerImpl>,

) Z7 x1 D9 u+ y

public TEvents_LoginServer<TLoginServerImpl>

9 Q( M0 O5 {9 k9 e

{

/ o! E, N& U+ ?* o6 ?

...

* z3 U& a) Z- `5 T

}

7 L* T; N: L$ ` T! x

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

8 E. F5 V' T5 d( P2 N

5 G. y- [( g' ], D

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

7 s) N; n( G+ o) _" m' j5 k/ R

public CComObjectRootEx<CComObjectThreadModel>, \

+ s, h" I# G" H& E `

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

0 s$ H" X( s) o! d7 M I

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

9 Z( r, E2 m7 ^# ~

LIBID_OF_##CoClass>

H! B L1 E/ o3 T+ ~

- X; w0 o( d' n2 W* a! x, s

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

+ [* K2 z/ U3 ~! ~% \0 ], c

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

* _ D" ~9 Q5 ]3 a* q8 q. i+ }

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

$ ?/ A5 ]" V9 Z

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

3 {! y; u) a. u7 v. a8 S

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

- w$ y' u c2 G# A* @0 N0 g

8 D# e4 _$ x. a* E& `5 U

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

! D2 v0 x# u5 Z& c; s

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

7 x$ ^) z2 R2 e; \% r! s" ^

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

8 t- Q2 |8 O7 Q6 C8 Z$ w- B

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

$ Z; }! D- Y9 Y3 G; c

. b" C+ b0 b; t( w* W9 g

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

/ H( J6 S' O5 N! d8 ?5 G" Q8 W

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

" \, v3 j# C6 b: o

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

0 M5 \& q( o4 q: K$ x. x7 h( ~1 Q

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

/ ]; y; k+ W+ l; d" H0 ]$ V

if(!IsLogin(OwnerData))

& Q- u: N9 |& Y- o- {* G5 M

{

0 [$ s0 e" P9 {0 r" f: f$ i

throw Exception("Please login first!");

% ^! y2 }1 M J4 U; d

}

. I5 H/ ~" N# Z1 M. l/ t8 z

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

) u' ?' j4 F, T" f4 [8 L r- B

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

" L4 W# O- M* P' P J

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

7 d1 G9 I, l; f1 N( h, e( g/ X' ]

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

2 t$ A8 }/ v) q. Q: X

OleVariant &OwnerData设置成相应的数据

# X$ a$ }( n) p; g3 N

$ `- J) D1 z! w; R

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

" B+ c. Z1 f- E7 g, N( f. R$ }$ |

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

: o O: ]" M8 D3 M( x! y' J

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

! b3 O8 T, `! [3 X

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

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-8-13 06:45 , Processed in 0.402832 second(s), 58 queries .

回顶部