教程中国
PHOTOSHOP CS9.0中文版 MAYA 8.5 FOR WINDOWS Corel Painter v9.0 Flash MX2004 中文版 Illustrator cs2 中文版
VC++6.0含sp6 中英文版 VB6.0 +sp6 简体中文版 Borland Delphi 7汉化版 MSDN for vb6.0中文版 Visual Studio 2005简体
教程中国下属 文件存储共享专家BIBIDU.COM 提供大型软件,教材,源码,电影,音乐,图书等下载 更多精品请点此进入
  您目前所在位置: 教程中国 >> 编程基地 >> Delphi >> 增强MIDAS的安全性 RSS订阅
增强MIDAS的安全性
教程(视频,书籍)下载:  ASP.NET AutoCAD 数据库 C# ASP java photoshop 网页设计 delphi 3dmax Flash C++ VB 张孝祥 实例   更多请进入BIBIDU搜索
IT搜索引擎   
   大家都知道,使用RemoteDataModule最令人头疼的就是安全性问题。
主要体现在:
1、远端只要知道应用服务器的端口号即可访问到应用服务器,而一旦访问到应用服务器,TClientDataSet即可获得ProviderNames列表。(观点:不让他轻易得到ProviderNames列表。)
2、一旦知道了ProviderNames列表,这就相当于将数据库暴露在外了。
例如:客户端可以通过SQL语句来对数据库进行操作了。(观点:我们的应用服务器根部不接受SQL语句。) 
因为看到大家此类贴多如牛毛,又没有什么更好的解决方法,因此我发表一下我的拙见。

我对IAppServer接口进行了进一步的扩展,增强了RemoteDataModule的安全性。主要体现在:
1、客户端侦测到应用服务器的端口号可以建立与应用服务器的连接,但必须提供由TClientDataSet提供一GUID作为密码方能在设计阶段获得ProviderNames列表。此功能使得系统外部人员无法在设计阶段直接在TClientDataSet的ProviderName中直接获得应用服务器的TProvider实例。如果想通过IAppServer来获取ProviderNames列表则必须提供这一特定的GUID作为密码。
IAppServer的AS_GetProviderNames原形为
function AS_GetProviderNames: OleVariant; safecall;
扩展后的函数为
function AS_GetProviderNames(Password:WideString): OleVariant; safecall;
系统外部人员能够访问TRemoteDataModule的Provider的唯一方法就是猜测(或者成为蒙)出可能有的ProviderName直接赋值给TClientDataSet的ProviderName属性。当然这是十分困难的(只要你不是直接将datasetProvider1作为TdatasetProvider的名称)。
2、虽然恶意者可能通过其他方法(包括猜测、穷举)来获取到一个具有较高权限的TProvider,但是此步的安全特性完全将其挡在了门外。
TClientDataSet必须提供加密后的CommandText串才能得到应用服务的正确相应。因为这里的加密对象是SQL语句(一个字符串),所以可以使用n多种加密方法。如果应用服务器解密出的串为非法SQL串,会向客户端返回SQL语法错误信息。
而我在处理时并没有对SQL进行真正的加密,而是在TClientDataSet的CommandText中包含了一特定的字符串作为钥匙,而如果服务器得到请求后在CommandText中没有找到这一钥匙则返回“Missiong SQL property”异常。如果服务器得到了这一钥匙,则将这一钥匙从CommandText串中移除后交给TProvider进行处理。

实现:
听上去好像很玄,但实现起来比较简单:
我这里简单说说对SQL串的加密方法:
打开Provider单元,找到TDataSetProvider的SetCommandText方法。
你应该明白了吧。。。

如果你比我还菜,你就这样写:
var commandt:string;
begin
if CommandText=’’ then Exit;
if Copy(Commandtext,1,8)<>’minercxy’ then Exit;
commandt:=Copy(CommandText,9,length(CommandText)-8);
if not(poAllowCommandTet in Options) then
DatabaseError(SCannotChangeCommandText);
CheckDataSet;
IProviderSupport(DataSet).PSSetCommandText(CommandT);
end;


发布问题,编译Provider单元并将Provider.dcu文件和并入应用服务器目录中,编译应用服务器。这样Tclientdataset必须提供
’minercxy’+’select * from ...’ 这样的命令才能被服务器承认。

我把’minercxy’暂且称为钥匙,钥匙可以自己进行随意设置,位数也可随意长度。当然钥匙的随机性越大安全性就越强了。



欢迎大家讨论。

来源:编程技术-十度教育
作者:
关键字:增强MIDAS,安全性
发表日期:2006-10-18 13:42:28

网页显示有限 阅读全文请下载本文完整版WORD文档

上一篇:获得远程或本地机器的网卡的MAC   下一篇:DELPHI中DBGrid中行的定位及着色实现


2008-10-16 7:29:30
本文的相类似文章
  • 保证Oracle数据库安全性的策略和方法
  • ORACLE培训教程(2)-数据库的安全性、完整性、并发控制和恢复
  • Oracle环境的安全性
  • Oracle高级安全性
  • 坚不可摧:Oracle的安全性承诺
  • Oracle 分布式数据库远程数据访问的安全性
  • 在ORACLE中利用角色增强应用系统安全性
  • 数据库安全性策略
  • 利用角色增强应用系统安全性
  • 浅论交换机配置中的安全性!
  • 在学习中进步 在进步中成长 教程中国相随您的成长之路
    华腾联合科技股份有限公司版权所有
    广告联系:Rosibo@163.com