Marquer les contrôles ActiveX MFC comme étant sécurisés pour l’écriture de scripts et l’initialisation

Cet article explique comment marquer les contrôles ActiveX MFC comme sécurisés pour les scripts et l’initialisation.

Version d’origine du produit : Contrôles ActiveX MFC
Numéro de la base de connaissances d’origine : 161873

Résumé

Par défaut, les contrôles ActiveX MFC ne sont pas marqués comme sûrs pour les scripts et sécurisés pour l’initialisation. Cela devient évident lorsque le contrôle est exécuté dans le Explorer Internet avec le niveau de sécurité défini sur moyen ou élevé. Dans l’un ou l’autre de ces modes, des avertissements peuvent s’afficher indiquant que les données du contrôle ne sont pas sécurisées ou que le contrôle n’est peut-être pas sûr pour les scripts à utiliser.

Il existe deux méthodes qu’un contrôle peut utiliser pour éliminer ces erreurs. La première implique le contrôle qui implémente l’interface IObjectSafety et est utile pour les contrôles qui souhaitent modifier leur comportement et devenir sécurisés s’ils sont exécutés dans le contexte d’un navigateur Internet. La deuxième consiste à modifier la fonction du DllRegisterServer contrôle pour marquer le contrôle comme sûr dans le Registre. Cet article décrit la deuxième de ces méthodes. La première méthode, l’implémentation de l’interface IObjectSafety , est traitée dans le Kit de développement logiciel (SDK) du client Internet.

Gardez à l’esprit qu’un contrôle ne doit être marqué comme sûr que s’il est, en fait, sûr. Reportez-vous à la documentation du Kit de développement logiciel (SDK) du client Internet pour obtenir une description de ce. Consultez Initialisation et scripts sécurisés pour les contrôles ActiveX sous la section Développement de composants.

Remarque

Cet article n’explique pas comment marquer un contrôle sûr pour le téléchargement. Pour plus d’informations sur le téléchargement du code et la signature du code, reportez-vous au Kit de développement logiciel (SDK) du client Internet.

Plus d’informations

Procédez comme suit pour marquer votre contrôle ActiveX MFC comme étant sécurisé pour les scripts et sécurisé pour l’initialisation :

  1. Implémentez les CreateComponentCategory fonctions d’assistance et RegisterCLSIDInCategory en ajoutant les fichiers cathelp.h et cathelp.cpp suivants à votre projet.

    • Cathelp.h

      #include "comcat.h"
      
      // 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);
      
    • Cathelp.cpp

      #include "comcat.h"
      
      // 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;
      }
      
  2. Modifiez le DllRegisterServer pour marquer le contrôle comme étant sécurisé. Recherchez l’implémentation de DllRegisterServer dans un fichier .cpp de votre projet. Vous devez ajouter plusieurs éléments à ce fichier .cpp. Incluez le fichier qui implémente CreateComponentCategory et RegisterCLSIDInCategory:

    #include "CatHelp.h"
    

    Définissez le GUID associé aux catégories de composants de sécurité :

    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 }} ;
    

    Définissez le GUID associé à votre contrôle. Par souci de simplicité, vous pouvez emprunter le GUID de la IMPLEMENT_OLECREATE_EX macro dans le fichier main .cpp pour le contrôle. Ajustez légèrement le format afin qu’il se présente comme suit :

    const GUID CDECL BASED_CODE _ctlid =
    { 0x43bd9e45, 0x328f, 0x11d0,
    { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    

    Pour marquer votre contrôle comme sécurisé pour l’écriture de scripts et l’initialisation, modifiez la DllRegisterServer fonction comme suit :

    STDAPI DllRegisterServer(void)
    {
        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(
        _ctlid, CATID_SafeForScripting)))
        return ResultFromScode(SELFREG_E_CLASS);
    
        if (FAILED( RegisterCLSIDInCategory(
        _ctlid, CATID_SafeForInitializing)))
        return ResultFromScode(SELFREG_E_CLASS);
    
        return NOERROR;
    }
    

    Normalement, vous ne modifiez pas la DllUnregisterServer fonction pour les deux raisons suivantes :

    • Vous ne souhaitez pas supprimer une catégorie de composant, car d’autres contrôles peuvent l’utiliser.

    • Bien qu’une UnRegisterCLSIDInCategory fonction soit définie, par défaut DllUnregisterServer , supprime entièrement l’entrée du contrôle du registre. Par conséquent, la suppression de la catégorie de l’inscription du contrôle est peu d’utilité.

    Après avoir compilé et inscrit votre contrôle, vous devez trouver les entrées suivantes dans le Registre :

    • HKEY_CLASSES_ROOT\Component Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}

    • HKEY_CLASSES_ROOT\Component Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}

    • 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}

References

Kit de développement logiciel (SDK) client Internet - Développement de composants - Initialisation et scripts sécurisés pour les contrôles ActiveX