剖析ActiveX控件安全问题 下

来源:互联网 发布:yum install package 编辑:程序博客网 时间:2024/05/03 02:11
剖析ActiveX控件安全问题 下
2006年11月11日 星期六 10:27

3.3.4、手动修改注册表

     我们可以自己手动为控件在注册表中添加安全支持,实际上我们所需要的两个项(Key)就是这样的形式:

/HKEY_LOCAL_MACHINE/SOFTWARE/Classes/CLSID/<GUID of control class>/Implemented Categories/<GUID of category>

     ActiveX SDK头文件ObjSafe.H 已经为类别CATID_SafeForInitializing和CATID_SafeForScripting定义了GUID值。因此对于特定的工程,如果控件类的GUID是{20048BB3-DB68-11CF-9CAF-00AA006CB425},那么我们就只需要添加两个注册表项:  

   REGEDIT4
       
   [HKEY_CLASSES_ROOT/CLSID/
{20048BB3-DB68-11CF-9CAF-00AA006CB425}/Implemented Categories]
       
   [HKEY_CLASSES_ROOT/CLSID/
{20048BB3-DB68-11CF-9CAF-00AA006CB425}/Implemented Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
       
   [HKEY_CLASSES_ROOT/CLSID/
{20048BB3-DB68-11CF-9CAF-00AA006CB425}/Implemented Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}]

     将以上代码拷贝到一个*.reg中去,保存后执行就可以将GUID为{20048BB3-DB68-11CF-9CAF-00AA006CB425}的控件类注册为安全控件。有时候注册表中不一定有那两个类别,因此我们还需要自己来描述这两个重要的类别: 

REGEDIT4

[HKEY_CLASSES_ROOT/Component Categories]

[HKEY_CLASSES_ROOT/Component Categories/
{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
"409"="Controls that are safely scriptable"

[HKEY_CLASSES_ROOT/Component Categories/
{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
"409"="Controls safely initializable from persistent data"

     同样,将以上代码拷贝到*.reg文件中执行后,就可以生成这两个类别。以后就可以使用这两个类别来注册安全控件了。注意:除非你没有别的办法,千万不要使用这个方法,也不要使用这个方法来标记实际上并不安全的控件为安全控件。

     那么方法3和方法1和2有什么不同的呢?其实他们最大的不同就是方法1和2实际上都加入各种判断代码在修改注册表之前和之后,实际上也防止了不安全控件注册为安全控件的行为。因此除非万不得已,不要用方法3。就算是方法1和方法2,也要在确定自己控件足够安全的情况下才使用。

3.4、另一个问题

  在施行了这些方法后,那个讨厌的对话框没了,但是对于window XP SP2及以上版本来说,用默认安全级别的IE打开任何包括了控件或者脚本的网页时,在运行代码前都会弹出一个这样的条框:

 

 

 

     这也是为了不断提醒用户这样的操作可能会有安全上的危险,可是这样也会影响用户的操作,对于一个频繁访问的某一个页面来说,这个横条和对话框都是不易忍受的,如果你正在编写这样包括脚本和控件的页面,那么这里有一个窍门来解决这样的问题。请把下面这句加在网页文件源代码的<html>和<head>之间:

<!-- saved from url=(0017)http://localhost/ -->

     在你做网页时,如果网页需要运行ActiveX或脚本,并且他们位于客户端以外的地方,那么可以添加这个注释语句,IE当然不会不理他, IE会按照他指出的URL去找脚本的位置。 这句话的作用是让Internet Explorer 使用 Internet 区域的安全设置,而不是本地计算机区域的设置。其中0017代表后面网址的字符个数,后面的网址字符串要指向注册了这个组件或脚本的地方。如果是象上面那样,就表明是在自己的电脑上。把这句话删除,有些脚本就不执行了。

3.5、什么是足够安全的控件

     我怎么知道我的控件是不是足够安全呢?请好好看看这一节。一旦标注出现在控件上而非网页上时,那些标注为安全的控件就一定要在所有可能的网页上是安全的。因此一个控件被标注为安全的就表示它能够保护自己并与网页制作者可能在初始化或脚本过程中做的不愉快的东西隔离。实际上很容易检验当被用于网页时一个控件是否安全的:当你标注你的控件为初始化安全时,相当于你在发誓无论用什么样的值来初始化你的控件,都不可能发生伤害用户的系统或者威胁到用户的安全;当你标注你的控件为脚本安全时,那就是说你有把握说无论控件的函数和属性如何被网页的脚本操作,控件本身都不会做出危及用户安全的行为。换句话说,它必须接受任何脚本中任何顺序的函数和/或属性调用而不会发生危险。 在设计控件过程中,下面是一些表明此控件是安全的条款:

  • 不要操作用户的文件系统;
  • 不要操作注册表(除非是注册和注销它本身);
  • 不要数组越界或其他的内存错误;
  • 验证(或更正)所有的输入,包括初始化,方法的参数和属性的Set函数;
  • 不要滥用与用户有关的活是用户提供的数据;
  • 做大量的测试。

     这份表还远没有结束,但这些至少都是必要的。还有一点很重要,就是千万不要把本来实际上不安全的控件注册为安全的,尽管这很诱人(比如说你没有控件的源代码)。无论控件做什么事情的,一旦控件被标注为安全的,那么所有的网页都会省略对这个控件的安全检测。到目前为止,还没有方法能把一个控件标注为仅对特定网页是安全的。标注不安全控件为安全空间的一个简单安全的选择就是写一个包含了不安全控件的新安全控件。只要确保新安全控件的初始化,方法和属性都是安全的就行了。

4、总结

     控件的安全问题可以通过各种各样的方法来巧妙的解决,但是对于一个负责的程序员来说,一定要确保控件本身是绝对安全的。一个欲发布的控件往往是要有用户使用的,如果本身不安全的控件被当成安全的控件流传出去,那就是恶意行为了。为了对用户负责,也为了对自己负责,程序员一定要再三检查自己的控件是否足够安全,而后再决定是否发布。

 
原创粉丝点击