QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

! L, R9 v0 o+ r+ f R

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

; U7 @9 z2 U7 |; c! {/ ~

# m) ?/ ~# ]2 o* [% Y# o' B3 J

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

C7 z' y) R0 y* X5 Y

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

9 \# ^0 s' X5 O

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

) }+ R1 i) Q) B R' Z$ x

考察一个实例

3 g: g" I8 H6 b4 b5 g

. G, N1 g B/ v1 J; ?7 d6 w) X

class ATL_NO_VTABLE TLoginServerImpl

; s! j Z: q5 T9 j( P6 i4 H

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

) v4 z7 v6 C( N1 w

Server),

: I5 v4 y+ n2 E* F& U5 s I

public IConnectionPointContainerImpl<TLoginServerImpl>,

- `, H/ ~9 n' K" T' m0 z

public TEvents_LoginServer<TLoginServerImpl>

9 ?7 B, H' ^" S# M, [

{

: a0 M8 D: [' O9 l% C

...

" {: r& ` k# I

}

, K$ `' @! I& ]8 k8 R7 K

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

) f8 r) f/ [9 _8 N# h6 s

, O+ d9 U; H7 m% O8 [

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

! h) Y- y- E* N K2 ^9 \

public CComObjectRootEx<CComObjectThreadModel>, \

' y: q! T; w; C4 H% {* Q$ q5 r

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

4 q3 P# m- W1 U ?1 |- D

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

# @/ q7 S) H# P: i5 d$ y U3 P

LIBID_OF_##CoClass>

2 t3 Q. _- V1 o% ]' n$ B, Q

/ U8 H$ s( n# |# H6 ?" r( z9 r

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

2 p' i9 b1 _2 j+ ~9 ^

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

4 m( z. b/ {; l5 i7 I

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

% ^' e) \( |; S( U% L

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

: ]* R. V& I) h7 Y

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

) V$ V/ I) ]% w) O9 p6 V

, R; J* u. g: B; \* ^; I( U

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

- k% ?7 o1 X- E- i3 m# ?) J8 u5 ~9 n# N

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

! A: j: }+ k4 S, K1 e9 @

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

5 H: T# u9 K3 X

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

5 B0 m, ]& r# }) C1 ^8 `

7 ]& J! r3 H: @. g6 B4 z! t9 p

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

8 q7 z" s" @2 _7 a0 m t: s

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

! u+ w" v, b2 U. ~7 [& v

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

) Y: S/ H/ `" v

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

& g# }$ e' f% q

if(!IsLogin(OwnerData))

6 R( I' B/ W6 n: B/ F* c3 J

{

& _1 e6 ?6 J! M5 }% k/ |$ G) j; o

throw Exception("Please login first!");

' Y; S- w: p& f4 O7 X! [( P

}

1 |+ p$ P! b* X% c* N

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

2 }2 J. ?5 R6 k& {: b1 m

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

5 q/ }; J |, |/ d

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

/ H3 p" A s& X, W% f; _1 E

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

. _6 }8 m. u/ |! }' ]& W5 |

OleVariant &OwnerData设置成相应的数据

, `7 z/ {- t% u( E( Q$ _: E

: a6 H( s- ~2 }$ @6 K0 M. r

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

% {: z$ b8 z: H4 d Q

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

( m- n9 q8 U! P# s* @3 A/ v3 u

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

; i% r8 U8 Z7 J$ I1 p2 @3 j9 E

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

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 09:01 , Processed in 0.331888 second(s), 52 queries .

回顶部