QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

/ u; b6 y2 J8 |; q4 R z5 B

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

7 J$ G, [7 F0 R1 p8 d$ p) _

: ]) c3 W I' s

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

$ \& u, L( Q$ r0 ?

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

1 k, |# T: A: P% Z; O5 h- ?

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

% H! u+ o: \5 S9 _/ g

考察一个实例

$ C$ Q2 s, C# R) B$ U$ c+ M r

2 D2 I9 K! ?0 C

class ATL_NO_VTABLE TLoginServerImpl

% i$ S7 i/ t. H+ y

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

5 p- o5 C" D) G2 \" \

Server),

) s5 x5 ~" m9 d& m# b

public IConnectionPointContainerImpl<TLoginServerImpl>,

6 L5 X* X- Y& Z5 S$ \+ P

public TEvents_LoginServer<TLoginServerImpl>

1 C# W* i8 H( ?8 q

{

; C7 F$ A. z) E8 E- Q

...

3 f8 L& }5 X0 B( D

}

+ S7 z4 ^: l5 o

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

8 o$ Q9 J5 w5 d

- ]0 S5 f1 N* I1 A+ t. [

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

, J' }/ p6 g" Y O# [% G

public CComObjectRootEx<CComObjectThreadModel>, \

( j) G, o; a; B% D! q. ^9 x: j" G2 d) h

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

$ m) g: }4 @% z: [

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

" \7 V. N$ i2 T9 k' t( c

LIBID_OF_##CoClass>

% X( n H! t' U5 [$ G

1 y' _4 Z! e1 i; q& D& D' k7 B

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

, v' S) z! L, s) s, b

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

( Y0 `; p7 ?1 ?2 @4 l

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

6 l9 ]* Q& d4 l

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

`5 x: ]( S; \ s$ F

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

* G: t4 O5 Z; e' |9 _

9 G% f# l! R8 N/ D# y9 M

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

# ^9 x+ B \5 s3 E

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

( _: W/ o( }6 K; x: f+ N: i

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

o9 b J% y9 e- t/ s2 x5 P

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

5 A, n" t/ ]2 f: c4 W- X7 L; i

! |4 U8 c, Z6 w! k }8 T0 \( L

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

& r4 I# E" p! a3 Y3 K2 l

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

% L6 K5 j5 s$ e8 U- @" Y

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

! X2 o. _( |, o7 Z- S

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

, W- t b, L9 x% |& M. n

if(!IsLogin(OwnerData))

" y I2 d7 |* ^

{

2 ^: R5 {+ C8 y

throw Exception("Please login first!");

6 {' p% o) j; }1 J' S W7 C2 ^" E

}

6 W' x- x( `: K9 ^4 L* B9 M

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

; ?4 L+ e0 l: e. Z1 D" U% B

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

1 L; E9 m; B3 `

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

2 n2 A4 J( R4 U

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

& O; ~2 O1 c* f. k" ]' ]8 g

OleVariant &OwnerData设置成相应的数据

4 V* S* B3 I8 T& X9 w) u! N& d

$ p. `' }; E; H: @

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

& ^5 b1 `/ L$ g& M4 I3 l5 M/ @, O

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

5 H* u9 w. S! p( H% Y, w

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

7 s, s6 s5 z4 H

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

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 19:20 , Processed in 0.409773 second(s), 52 queries .

回顶部