ActiveX控件开发的一些问题一,如何标记控件为安全

转载 2013年12月04日 14:11:55
       我们采用了ActiveX的方式开发了一个嵌入到页面的小程序,可以实现对多文件的上传。因为还不能支持断点续传所以只支持小文件的传输,但是能一次传输多个小文件对于邮件方面的应用也是很方便的。而且有进度条显示这也给了用户较好的提示。同时我们支持拖入功能,用户可以直接将文件拖入到控件中,即完成对上传文件的选取。

     

      下面对开发中遇到的一些问题进行说明,全文基本为原创,其中参考了很多他人的经验和资料,参考处我会注明原出处。

       

      第一个问题如何标记控件为安全

 

 

    控件发布第一步如何将控件标记为安全的。如果不将控件标记为安全,浏览器将会web页面与控件交互时提示如下信息:

    ActiveX不安全提示

        

    MSDN上对这的解释是:默认,MFC ActiveX控件不被标记为可安全编写脚本和可安全初始化。当IE运行安全级别设置为中等或高时,都回提示控件不安全。

    消除提示有两种办法,The first method uses the Component Categories Manager to create the appropriate entries in the system registry.即修改控件的DllRegisterServer函数来,在注册表中标记控件为安全的。The second method implements an interface named IObjectSafety on your control.第二种方法可以详见

http://dcs.isa.ru/www/vladimirv/inetsdk/inet0002.htm

    这里就第一种方法进行说明,在MSDN上也有第一种方法的详细说明。网址:

    http://support.microsoft.com/kb/161873/zh-cn

    但是该方法有一些不足,这里结合Phinecos(洞庭散人)的blog

(http://www.cnblogs.com/phinecos/archive/2008/08/07/1263270.html)进行说明。

   

1.添加辅助函数

    控件的基本结构中含有xxApp,xxCtrl,xxPropPage三个类。找到xxApp的头文件,添加三个辅助函数。

// Helper function to create a component category and associated

// description

HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);

// Helper function to register a CLSID as belonging to a component

// category

HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

// Helper function to unregister a CLSID as belonging to a component

// category

HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

    找到xxApp的实现文件,添加三个辅助函数的实现。

// Helper function to create a component category and associated

// description

HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)

{

    ICatRegister* pcr = NULL ;

    HRESULT hr = S_OK ;

    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

                     NULL,

                     CLSCTX_INPROC_SERVER,

                     IID_ICatRegister,

                     (void**)&pcr);

    if (FAILED(hr))

    return hr;

    // Make sure the HKCR/Component Categories/{..catid...}

    // key is registered

    CATEGORYINFO catinfo;

    catinfo.catid = catid;

    catinfo.lcid = 0x0409 ; // english

    // Make sure the provided description is not too long.

    // Only copy the first 127 characters if it is

    int len = wcslen(catDescription);

    if (len>127)

    len = 127;

    wcsncpy(catinfo.szDescription, catDescription, len);

    // Make sure the description is null terminated

    catinfo.szDescription[len] = '/0';

    hr = pcr->RegisterCategories(1, &catinfo);

    pcr->Release();

    return hr;

}

// Helper function to register a CLSID as belonging to a component

// category

HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

{

    // Register your component categories information.

    ICatRegister* pcr = NULL ;

    HRESULT hr = S_OK ;

    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

                     NULL,

                     CLSCTX_INPROC_SERVER,

                     IID_ICatRegister,

                     (void**)&pcr);

    if (SUCCEEDED(hr))

    {

    // Register this category as being "implemented" by

    // the class.

    CATID rgcatid[1] ;

    rgcatid[0] = catid;

    hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);

    }

    if (pcr != NULL)

    pcr->Release();

    return hr;

}

// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry

HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

{

    ICatRegister *pcr = NULL ;

    HRESULT hr = S_OK ;

    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

        NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);

    if (SUCCEEDED(hr))

    {

        // Unregister this category as being "implemented" by the class.

        CATID rgcatid[1] ;

        rgcatid[0] = catid;

        hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);

    }

    if (pcr != NULL)

        pcr->Release();

    return hr;

}

2.定义GUID

    需要定义两个GUID用来注册控件安全性。

const CATID CATID_SafeForScripting =    {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};

const CATID CATID_SafeForInitializing =      {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};

       在控件自动注册完成后,可以在注册表的如下地方看到上面的两个GUID。

  HKEY_CLASSES_ROOT/CLSID/{"your controls GUID"}/Implemented
  Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}
  HKEY_CLASSES_ROOT/CLSID/{"your controls GUID"}/Implemented
  Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}

    同时需要定义要注册为安全的CLSID。

    控件有四个UUID,这里我们需要将xxCtrl的UUID注册成为安全的CLSID,因为我们控件的主体功能是在这个类中实现的。

const GUID CDECL BASED_CODE _tlid =

       { 0x7DE84B6C, 0x9969, 0x4DE0, { 0xBE, 0x25, 0xC6, 0xC0, 0x63, 0x20, 0xA3, 0x70 } };

const WORD _wVerMajor = 1;

const WORD _wVerMinor = 0;

const CATID CLSID_SafeItem =

       {0x4e586c5a, 0xfd41, 0x4e4c, {0xb6, 0x6d, 0x63, 0xf1, 0x10, 0xc8, 0xc4, 0xb9}};

    这里的CLSID_SafeItem就是xxCtrl的UUID。

3.修改注册代码

// DllRegisterServer - 将项添加到系统注册表

STDAPI DllRegisterServer(void)

{

    /*这里是原来的注册代码

    OLD

    AFX_MANAGE_STATE(_afxModuleAddrThis);

    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))

       return ResultFromScode(SELFREG_E_TYPELIB);

    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))

       return ResultFromScode(SELFREG_E_CLASS);

    return NOERROR;*/

   

    //NEW下面是新的注册代码

    AFX_MANAGE_STATE(_afxModuleAddrThis);

    if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))

      return ResultFromScode(SELFREG_E_TYPELIB);

    if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))

      return ResultFromScode(SELFREG_E_CLASS);

    if (FAILED( CreateComponentCategory(

         CATID_SafeForScripting,

         L"Controls that are safely scriptable") ))

       return ResultFromScode(SELFREG_E_CLASS);

    if (FAILED( CreateComponentCategory(

         CATID_SafeForInitializing,

         L"Controls safely initializable from persistent data") ))

       return ResultFromScode(SELFREG_E_CLASS);

    if (FAILED( RegisterCLSIDInCategory(

         CLSID_SafeItem, CATID_SafeForScripting) ))

       return ResultFromScode(SELFREG_E_CLASS);

    if (FAILED( RegisterCLSIDInCategory(

         CLSID_SafeItem, CATID_SafeForInitializing) ))

       return ResultFromScode(SELFREG_E_CLASS);

    return NOERROR;

}

// DllUnregisterServer - 将项从系统注册表中移除

STDAPI DllUnregisterServer(void)

{

    /*

    OLD这里是原来的代码

    AFX_MANAGE_STATE(_afxModuleAddrThis);

    if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))

       return ResultFromScode(SELFREG_E_TYPELIB);

    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))

       return ResultFromScode(SELFREG_E_CLASS);

    return NOERROR;*/

   

//NEW下面是新的代码

    HRESULT hr;

    AFX_MANAGE_STATE(_afxModuleAddrThis);

    // Remove entries from the registry.

    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,

        CATID_SafeForInitializing);

    if (FAILED(hr))

        return hr;

    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,

        CATID_SafeForScripting);

    if (FAILED(hr))

        return hr;

    if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))

        return ResultFromScode(SELFREG_E_TYPELIB);

    if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))

        return ResultFromScode(SELFREG_E_CLASS);

    return NOERROR;

}

    到此完成了控件的安全标记。

将ActiveX控件标记为安全

IE ActiveX 控件 安全
  • lonelyrains
  • lonelyrains
  • 2016年03月15日 20:42
  • 1409

C#实现一个ActiveX控件

C#实现一个ActiveX控件 要使用C#实现一个ActiveX控件,需要解决三个问题: 1.使.NET组件能够被COM调用 2.在客户机上注册后,ActiveX控件能通过I...
  • xingxing513234072
  • xingxing513234072
  • 2014年01月06日 15:05
  • 1288

web上面开发安全控件使用Activex控件

首先要说明的是 web上用activex是门被抛弃的技术。为什么这么说,主要基于以下几个原因:1.功能过于强大,强大到一旦安装,他所具有的权限可以做任何事,极易被人利用做坏事(相信大家都有浏览网页后莫...
  • ghevinn
  • ghevinn
  • 2013年10月22日 13:36
  • 3405

ActiveX控件安全初始化之一:实现ISafeObject接口

转自:http://www.cnblogs.com/carekee/articles/1772201.html ActiveX控件打包成cab后,在脚本中调用中时,要保证控件的安全性才能...
  • rankun1
  • rankun1
  • 2016年06月22日 17:29
  • 1440

vs2010开发activex(MFC)控件/ie插件(二)

vs2010开发activex(MFC)控件/ie插件(二):js传参数              js传参数给activex控件。          先看demo效果: 在上一篇成功生成acti...
  • yhhyhhyhhyhh
  • yhhyhhyhhyhh
  • 2016年03月04日 14:05
  • 2130

如何将MFC ActiveX控件标记为安全

在**Ctrl.cpp中增加如下函数  HRESULT   CreateComponentCategory(CATID   catid,   WCHAR*   catDescription)     ...
  • pengpeng98
  • pengpeng98
  • 2007年07月04日 14:18
  • 3142

如何将 MFC ActiveX 控件作为安全标记为脚本和初始化

http://support.microsoft.com/kb/161873/zh-cn默认状态下,MFC ActiveX 控件未标记为脚本安全和初始化的安全。当该控件的运行时在 Internet E...
  • sding
  • sding
  • 2010年10月12日 11:50
  • 1513

【VS开发】免费打工仔:一个完善的ActiveX Web控件教程

作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个ActiveX控件。其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method)、属性...
  • LG1259156776
  • LG1259156776
  • 2016年07月24日 08:57
  • 730

WEB密码安全输入控件

在没有使用ssl加密的系统中登录,登录的用户名和密码都是在网络中通过明文传送,安全性较低,可以使用插件形式对密码进行加密后再传送,使用键盘钩子拦截键盘输入内容,防止被其它工具记录,类似银行网银安全输入...
  • nxiaoping
  • nxiaoping
  • 2013年11月18日 20:08
  • 4338

ActiveX控件如何去除在Web使用时的安全警告

    Web上使用ActiveX控件时,用两种安全防护,一是下载,二是使用。对于未签名的ActiveX控件,在IE的选项中有相应处理。我们不考虑下载,假定控件已在用户机注册(可能是额外的小安装包),...
  • tiger119
  • tiger119
  • 2006年05月24日 18:25
  • 4048
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveX控件开发的一些问题一,如何标记控件为安全
举报原因:
原因补充:

(最多只允许输入30个字)