
自网络编程从上个世纪九十年代中期开始流行之后,为了可以在浏览器中创建快速、健壮的用户界面,开发者就开始寻找增强普通HTML的途径。Web页面中加载ActiveX控件就是满足这个需求的一种技术,ActiveX控件可以在各种版本的Internet
Explorer(IE)以及带有插件的网景浏览器上运行。
ActiveX控件的确是一种强大的网络编程工具;然而,大多数开发者都清楚的认识到这样一个事实:即如果在开发ActiveX控件的时候没有采取合适的安全措施,那么它们的安全性就得不到保障。让我们看看在网络开发中采用ActiveX控件潜在的风险、减轻这些风险的方法、以及可以取代ActiveX控件的其它技术。
存在哪些问题?
ActiveX控件(作为COM对象)的最初设计目标是成为一种可编程的软件组件,这样它可以装配到Windows应用程序中来快速形成容易设计的用户界面。这些组件可以编译成本地指令(native
instruction)并可以自由调用目标操作系统中的Win32 API。
当网络编程开始变得重要起来之后,微软提供了<OBJECT>元素管理IE中网页的这些控件。ActiveX控件可以借助IE快速下载到用户机器上并执行它们的本地代码。不幸的是,IE没有控制这些代码执行的方法,因此ActiveX控件可以在当前登录用户的权限范围内毫无约束的调用Win32
API。这就意味着ActiveX控件和操作系统是紧密联系的,它可以管理诸如文件之类的资源并可以以当前登录用户的身份注册本地机器。
由于ActiveX控件可以做任何当前用户权限下所有可以做的事,开发者必须清楚下面的问题:
- 无效数据和缓冲区溢出:大多数ActiveX控件通过方法或者本地以及远程文件来获取数据。如果恶意用户传递无效数据(bad data)或者数据长度超过期望值,那么他(她)就可以使得分配给该控件用以保存该数据的缓冲区溢出,并在这个过程中有意识的改写其它数据结构(如返回地址的函数或者函数指针)。这样,恶意用户通过无效数据就从本质上控制了该控件,造成该控件的用法不可预测、这就有可能造成破坏。
- SQL或者脚本注入攻击:许多ActiveX控件使用HTML或者基于脚本的输入来产生SQL语句,并把SQL语句发送到远端数据库服务器上。恶意用户可以通过这样的输入在SQL中嵌入攻击数据库或者窃取保密信息的语句。某些控件用同样的方法使用脚本把输入写到HTML页面中。恶意用户可以在输入中嵌入脚本并运行他们自己的脚本。
- 导致不可预测后果的脚本:大多数ActiveX控件为脚本一个方法和属性集合,脚本位于网页上,它们用于管理这些控件。如果恶意用户可以传递无效文件路径、网站地址或者其它标识符,那么他(她)就在本质上篡改了你的控件的用途,并导致了本地机器或者与该控件相联系的服务器的问题。
- 篡改其它网站控件的用途:由于ActiveX控件下载并安装到用户机器上,因此只要通过ActiveX控件的COM CLSID就可以访问到它。这就意味着恶意用户可以在他(她)的网页上载入你的ActiveX控件,然后用它实现你不知道的目的。一旦知道了控件的地址,那么网站就可以通过<OBJECT>元素来调用该控件。