QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

A+ M% V2 b! c% o9 s1 f6 ?

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

9 S! w7 A, E) b; f8 n

0 Z* C$ b* d" N7 Q- N

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

7 N x% R) L Z5 h: ~7 ~

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

9 J" n0 ?; h Z" m8 I

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

2 ^+ B/ M6 p/ x) B( t$ T

考察一个实例

& s6 x8 w4 ~) _

( f/ ?+ ~- {, |" o

class ATL_NO_VTABLE TLoginServerImpl

8 k; s) d: l5 P! O: {

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

3 m9 o, q/ I O

Server),

& L6 E0 B; z, R; A" h2 o

public IConnectionPointContainerImpl<TLoginServerImpl>,

2 o1 D3 c0 G% T R

public TEvents_LoginServer<TLoginServerImpl>

r5 f0 W2 e( v |* G

{

" M% E4 }% ~: \1 p. v1 g3 c

...

5 U8 w6 L E# u2 S

}

) ^# }# H+ v. D o U

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

' Q& _* K7 I5 Y2 q6 Z- D

( W) z2 o- ?% Y( M) Z' b9 g+ _

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

7 ?- `! ^; J. I2 X

public CComObjectRootEx<CComObjectThreadModel>, \

p3 F5 e. x7 z2 X

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

+ N0 {, k9 ]3 B+ F

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

! K/ T$ _7 X6 p4 L( Y9 z

LIBID_OF_##CoClass>

* o" I2 L- R$ ^- @/ Z

( m8 f# \' F" O6 H

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

) l3 c9 \+ ?6 u

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

1 V! v* h- a% k

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

8 h4 Q& A& a- B" \# k

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

1 g+ t& p) _7 N5 X B* l

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

: n+ S, S2 i$ g P. P

0 K% T4 o, d7 T

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

. w! q" N# y( N; R. L

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

6 t! J- J5 O6 h$ M& m3 b4 j3 `

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

5 k+ d# P8 H) I% x4 E: m+ P3 F. D

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

3 A% D- N. _) e4 Q, l0 x' V

3 ?4 ^5 p4 _! R

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

. v% D& F, ]. _) W+ d' ~2 A

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

' x; Z; V7 W$ U' k( I! Y9 X" J; {

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

) `; j- p1 S2 H) p# ~) s/ O

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

0 D! U, v* r5 H! E/ a' x" r

if(!IsLogin(OwnerData))

/ e" _3 y% d6 X

{

' l+ @$ V2 h# T9 Y/ I" s; x

throw Exception("Please login first!");

" p" } Y3 j3 L( J1 m3 T4 n

}

. U- \5 m1 b. v4 l; \& z

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

& }& g0 l& n/ O4 ^ R% }8 d

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

3 e/ E9 N( e' U# k

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

% o- F$ ^* R! z2 d

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

+ ~, I+ }/ ~, D/ ~/ s% e+ M# l

OleVariant &OwnerData设置成相应的数据

' U9 b9 N0 a4 V, ^' Y- p% }

& R0 p: e4 [2 z9 |! z* g

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

1 F4 A+ m: q9 W' D6 [

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

( C5 s+ p) U5 Y

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

8 R3 h9 W" Q. [* }# d, t9 p

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

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-6-11 03:36 , Processed in 0.410472 second(s), 52 queries .

回顶部