QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

. y% U0 j, j9 s

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

1 _- ^5 W# s0 f% o3 |0 ]2 Y9 {

9 c7 w& {, W+ b1 ]$ \& s( `

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

2 J" S" G: o' H3 u

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

+ g( K) K" [6 R0 x( k" o# u3 ^

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

7 a, v3 T/ p- C3 g# ]

考察一个实例

* }) U9 j3 x6 |

4 c; l0 ?3 A5 Z, P, {) i1 p7 F

class ATL_NO_VTABLE TLoginServerImpl

' Z1 N- X4 B6 j

: REMOTEDATAMODULE_IMPL(TLoginServerImpl, LoginServer, TLoginServer, ILogin

7 H) _' M" t: f0 y4 ]( S6 K, e( k

Server),

! t. H9 q/ j. |6 F: m

public IConnectionPointContainerImpl<TLoginServerImpl>,

3 G7 X/ _" J' G* h

public TEvents_LoginServer<TLoginServerImpl>

2 E, _( Z0 _) u5 Y. f% b G

{

! d; n, L3 n7 o. O, z

...

! b g+ p) v n( R+ i

}

( J0 c' g: F# _) }

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

1 r5 w" z# E1 B! J$ i; j4 }

! d/ V0 s4 u' b9 J5 C8 t

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

' r, i) }8 ?. }" {3 f& l

public CComObjectRootEx<CComObjectThreadModel>, \

9 s7 i4 g! r. F7 L! u

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

) K$ x6 a4 E, s, E1 t4 i8 t4 q

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

5 F! t% o) U3 q! J9 `# W* X7 n: y

LIBID_OF_##CoClass>

" { R$ G) C7 B; W

5 H1 O3 L7 H. N5 V a% Z9 d

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

: {1 G8 w/ I' W. N# ^$ g

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

& ~5 P; B# }3 J1 d5 R

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

7 r2 ~. q5 J8 |; H* e; l/ ]

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

. i1 F W( i& h" ^& l0 q

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

& y" s& o( G, A: j. l* t( u3 M* W! V

% ?$ | n1 c3 y* ]2 `1 T" J+ n

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

# h3 k8 R0 Z: x6 v: a. T

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

* H% j, b# }2 m. r/ o9 l

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

' U1 d; S" g% |, t. i) f

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

/ J9 _2 Z) v; z' F- i; V% H

; g) v. N; q( k4 b

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

) U+ J1 J* s! c, w: y0 j7 k8 j

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

0 g! j( u$ T& V

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

' ]- L7 E! D' S2 K

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

4 i4 [+ h, n% N' X5 {

if(!IsLogin(OwnerData))

; G \1 P& I# ~5 L) a; ]9 u( c" t: Q

{

- V2 [4 O+ i& [- F" ^9 _& W7 E

throw Exception("Please login first!");

0 r. ^! f9 t0 L2 x% o

}

( n$ a8 t7 f* Q0 l& }

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

& \" C n: ]! S% [

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

( `; l; e0 t' P+ j4 k4 {5 S

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

4 Y! D% ?/ J! X. D

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

1 P: E: |$ B" P3 P' c

OleVariant &OwnerData设置成相应的数据

& y3 i9 \9 }$ @, ]/ Z" }/ I$ n) X

2 H. ?2 b9 K! ~/ F9 D

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

6 W" a! ?$ u5 k% q

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

x, B5 ^$ G; Z5 v( F; w

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

: o: {$ Q* R) j/ q0 o" c; M

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

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-10-18 08:19 , Processed in 2.064161 second(s), 51 queries .

回顶部