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 :
Implémentez les
CreateComponentCategory
fonctions d’assistance etRegisterCLSIDInCategory
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; }
Modifiez le
DllRegisterServer
pour marquer le contrôle comme étant sécurisé. Recherchez l’implémentation deDllRegisterServer
dans un fichier .cpp de votre projet. Vous devez ajouter plusieurs éléments à ce fichier .cpp. Incluez le fichier qui implémenteCreateComponentCategory
etRegisterCLSIDInCategory
:#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éfautDllUnregisterServer
, 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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour