关于MIDAS的安全问题的解决方案

2016-02-19 16:22 7 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐关于MIDAS的安全问题的解决方案,无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

 

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

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

  关于如果屏蔽Tclientdataset的providernames列表的问题,我在文章中也简单的写了一下,就算抛砖引玉吧。
  我直接贴出来了

  增强MIDAS的安全性

  大家都知道,使用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;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

   

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

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

  
   

  欢迎大家讨论。

  QQ:7943383
  我的方法很简单.根本就不用PROVIDER.SERVER和CLIENT来回传递数据流,在SERVER的接口中添加各种自定义方法.我权衡觉得这么做好处很多.
  避免了暴露PROVIDER的问题.
  客户端可以有选择性地对数据进行压缩/解压缩,加密/解密.灵活性很大.客户端用猫连接我也不惧.
  在提交数据时PROVIDER进行了太多封装,自动生成SQL语句等等.我总怕它生成的语句效率太低,尤其是在事务冲突时操作流程被封装了太让人不托底了,还是自己手工实现放心灵活.当然PROVIDER也可以手工处理提交,但那就跟我现在差不多一个意思了.
  能少学点东西.比如主从表同时更新怎么拿PROVIDER处理这样的烦恼我就没了.
  避免了PROVIDER的一些BUG.DATASNAP各部分都有一些BUG,有些还很严重.看大家经常提一些无法解释的怪异现象.我们不能总得造汽车之前先修机床啊.
  第一点是这样的,实际上我是改写了IAppServer的接口,这样直接使用原来的控件进行开发,是无法获取provider列表的。因为我们的目的就是不希望系统之外的人来获取这个列表
  每条语句都来一个钥匙是不是太麻烦了?何不在服务器都生成一个列表记录客户状态,客户登录时注册以下,以后在datatprovider事件中判断时候合法即可!如果有必要还可以在即可事件中判断!实现起来代码不是很多吧?
  还有这样的办法解决,在服务器端定义一个方法
    procedure checkLogin(const UserName, Password: WideString); safecall;
    定义一个全局变量LoggedIn为 boolean
    获取数据时检查LoggedIn是否为真
  在checkLogin内容为以下

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  procedure TXXX.Login(const UserName, Password: WideString);
  begin
    {
    检测UserName,Password 是否为安全用户
    ...     }
    {如果成功}
    LoggedIn := True;
    {否则}
    LoggedIn := false;
    raise Exception.Create('Not logged in');
  end;

  客用端以DCOM为例 如下

  在 dcom onlogin 事件中加入
  DCOMConnection1.AppServer.Login(UserName, Password);
  这样就可以防止只要知道DCOM GUID就可以连接到服务器上的安全问题
  


来源:https://www.tulaoshi.com/n/20160219/1611885.html

延伸阅读
标签: 电脑入门
U盘问题无法安全拔出,每次都要重启电脑才行,这是什么问题呢?其实这个问题很多人都遇到过了,一般用以下两种方法来解决: 1、将U盘插到USB接口上,然后依次选择我的电脑→属性→硬件→设备管理器→磁盘驱动器,找到U盘项目,打开U盘的属性对话框,切换到策略选项卡,选中为快速删除而优化"单选按钮,单击"确定&quo...
1、日间护理:白天,唇部和脸部肌肤一样,承受污染、干燥、日晒的压力,所以,唇部一样需要滋润、隔离以及防晒,以对抗外来压力的“迫害”!所以唇部护理产品得选择以质感轻薄、不粘腻并带有一定防晒指数为佳~ 2、晚间护理:夜间休息,身心放松,是唇部进行修复和加倍滋润的好时机,相较于日间,晚间润唇产品需要加倍补水保湿,需要有修护...
标签: Web开发
如处理不当会影响用户体验,也有可能产生莫名的问题。 结合自己的思考和网上相关内容的参考,给出如下解决方案。每个方案都有不同的优缺点,欢迎 大家指正。 方案1:检查AJAX返回的返回的内容是否有html标签 在web系统中,当session过期时,当用户有操作的时候,此时系统一般会返回登陆界面。 让用户重新输入用户名和密码。当session过期的...
标签: Java JAVA基础
  一、概述   当网络编程越来越方便,系统功能越来越强大,安全性却指数倍地下降。这恐怕就是网络编程的不幸和悲哀了。各种动态内容生成环境繁荣了WWW,它们的设计目标就是为了给开发者更多的力量,给最终用户更多的方便。正因为如此,系统设计师和开发者必须明确地把安全问题作为一个考虑因素,事后追悔很难奏效。  ...
儿童玩具是为特定年龄组的儿童设计和制造的,它拥有一个关键性的因素,那就是能吸引儿童的注意力。不同年龄段的宝宝,玩具也是各式各样,玩具越来越多,玩具安全也成为人们不可忽视的问题。 常见的玩具安全问题 玩具安全很重要,很多玩具上松动的零件,毛绒玩具上未粘牢的眼睛、鼻子,玩具上掉落的纽扣,汽车上的轮子等,这些小零...

经验教程

697

收藏

39
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部