QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

3 K9 z8 `3 c5 g5 T

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

! d: t! I; {" V r% Q9 i

$ L3 P& M8 U1 r* V" d' P R X

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

6 J1 {( P% X. r

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

/ F- i# k+ `% J# T& y) y/ y

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

; @( h9 ^7 d( L- p9 [* @

考察一个实例

! j0 g7 d: l& K' T

8 {/ m3 p/ h; c' |: y; j

class ATL_NO_VTABLE TLoginServerImpl

" U" u9 @* H5 e' `- g

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

$ c( {. P! i5 P# U x7 B( f* M& w

Server),

. W7 {4 K% K0 O( F% `+ y) R$ O f

public IConnectionPointContainerImpl<TLoginServerImpl>,

# U7 v" |' }; G6 B

public TEvents_LoginServer<TLoginServerImpl>

' N6 z, b& |( @

{

# r+ t4 |* f9 L

...

^1 j$ w7 [) O f

}

1 N0 f6 o) j* c# y* h5 C

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

- t! ~. u' w7 }- Y% c/ ~6 g, V5 ]

: S X1 e5 i7 x+ H2 |2 t

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

7 e, m! j3 ]. T6 p2 \

public CComObjectRootEx<CComObjectThreadModel>, \

2 [0 m7 z* D: q9 s( X

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

. L) `* r0 i# S0 f1 b% U

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

5 L, i( C. y8 z: X& r+ ]5 @9 [4 O, S* G

LIBID_OF_##CoClass>

' l8 J7 ?1 c' e( c

_+ L7 z# h0 ^( g

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

) H: h( X6 g& L

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

9 v* v# [, q( g. ~- Q( @2 [

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

' X" x5 `* L$ V( v

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

! G# @: g# h5 O7 o

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

: ^7 c! ~+ i+ t) x

0 y* s: P- P9 W7 P. P

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

3 p& @: L# x a- g+ C

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

7 {, {- Y1 B& g- \( e, u

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

6 W% S9 ~8 q8 Y, B6 h: v# F

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

, \6 h( d* j7 ?8 Z9 f/ K5 q

: p- y0 r3 W& j

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

( N" A, w& f9 ]% D. Y0 O

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

8 A+ r8 d/ u+ E- a( E% q

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

) s4 v# F6 t/ X* k7 p; o

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

( U/ H. ?; f/ `# Z. G

if(!IsLogin(OwnerData))

5 y$ y0 Z# u: U3 O: J

{

! f( Q/ U9 W: [9 F3 W0 m

throw Exception("Please login first!");

% I; y4 f5 B) z2 _

}

* e1 ~ f3 T9 b, X6 p2 }

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

7 o' @9 B. c2 ]; k z4 X2 P

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

! B) M9 Y0 I6 d

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

- Q8 w' I' ~8 E- n$ q1 O, B( _4 J

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

9 H2 y1 u( w( P1 i7 R/ M$ ^1 S

OleVariant &OwnerData设置成相应的数据

! k/ G# n$ c5 V7 @7 t4 l1 M

! {% X D& F. p: ?: v% S8 L

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

( w& w/ t& [! O1 y- D" r7 \

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

& `: K) I! p1 {

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

1 m$ _3 ~# w. _" r2 d+ a

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

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-4-18 12:05 , Processed in 0.270973 second(s), 51 queries .

回顶部