SafeCtl.exe を使用して ActiveX コントロールで IObjectSafety を実装する

文書翻訳 文書翻訳
文書番号: 164119 - 対象製品
この記事は、以前は次の ID で公開されていました: JP164119
すべて展開する | すべて折りたたむ

目次

概要

SafeCtl.exe は、MFC ベースの ActiveX コントロールを変更して、コード発行者の識別と、コントロールが改ざんされたかどうかの確認を行う方法を示すサンプルです。このサンプルは、コントロールがスクリプトや初期化に対して安全かどうかを確認するために役立つことがあります。

詳細

下記のファイルは、「Microsoft ダウンロード センター」からダウンロードできます。
SafeCtl.exe
マイクロソフトのサポート ファイルのダウンロード方法を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
119591 オンライン サービスからマイクロソフトのサポート ファイルを入手する方法
マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用して、配布ファイルのウイルス チェックを行っています。配布ファイルはセキュリティで保護されたサーバー上に置かれており、権限のない第三者が無断でファイルを変更できないようになっています。

Microsoft Internet Explorer 3.0 以降では、ユーザーは、コードを ActiveX コントロールの形式で Web ページに追加することができます。<OBJECT> タグを使用して、コントロールを指定します。コントロールのインスタンスが作成されると、コントロールの固定インターフェイスを使用して、その属性を設定することができます。たとえば、Internet Explorer は、HTML ページの解析中に、<OBJECT> タグのコンテキスト内で <PARAM> タグを検出するたびに、対応するコントロールの IPersistPropertyBag インターフェイスを介してプロパティ バッグを渡します。さらに、Web ページに埋め込まれたスクリプトを使用して、コントロールの動作をカスタマイズすることができます。これらのスクリプトは、メソッドを実行し、コントロールの自動化インターフェイスを介して公開されたプロパティを変更します。

Authenticode コード署名技術を使用することによって、エンド ユーザーは、コード発行者の識別や、コードが署名後に改ざんされていないかどうかの確認を行うことができます。信頼されていない値によってコードのプロパティが初期化された場合や、信頼されていないスクリプトによってオートメーション モデルが起動された場合は、コードの安全性は保証されません。このようなセキュリティ上の潜在的な危険性を回避するため、Internet Explorer のデフォルトのセキュリティ設定 ([オプション] プロパティ シートの [セキュリティ] タブからアクセス可能) では、コントロール自体が適切なコンポーネント カテゴリを実装しているものとして登録されているか、コントロールに IObjectSafety インターフェイスが実装されている必要があります。サンプルでは、これらの両方の方法について説明します。

Internet Explorer では、HTML ページに埋め込まれたコントロールのプロパティを設定する前に、コントロールに対して IObjectSafety の照会を行います。サポートされている場合、Internet Explorer はこのインターフェイスで SetInterfaceSafetyOptions メソッドを呼び出し、固定インターフェイスのインターフェイス識別子 (IID) と共に値 INTERFACESAFE_FOR_UNTRUSTED_DATA も渡します。現在 HTML ページでは、<PARAM> タグを使用してプロパティが初期化される傾向があるため、IID は IID_IPersistPropertyBag となります。IID は、安全性が一部のインターフェイスでは保護されても、その他のインターフェイスでは保護されないようにするために提供されていますが、この例では重要ではありません。この実装例では、インターフェイスがサポートされているかどうかを確認します。この固定インターフェイスを介して初期化に使用されるデータにかかわらず、コントロールがクライアントのシステムに悪影響を与える可能性がなく、この固定インターフェイスがサポートされている場合は、コントロールの IObjectSafety::SetInterfaceSafetyOptions メソッドを実装すると、S_OK が返されます。それ以外の場合は、E_FAIL が返されます。

ページに埋め込まれたスクリプトの実行を許可する前に、Internet Explorer は、コントロールの IObjectSafety:: SetInterfaceSafetyOptions メソッドを介して同様の呼び出しを実行しますが、ここでは、値 INTERFACESAFE_FOR_UNTRUSTED_CALLER と、一部のスクリプト インターフェイスの IID を渡します。この IID は、通常 IID_IDispatch です。コントロールは、状況に応じて S_OK または E_FAIL を返します。

コントロールが IObjectSafety をサポートしていない場合、Internet Explorer はコンポーネント カテゴリ マネージャを使用して、初期化の安全性を示すカテゴリ CATID_SafeForInitializing と、スクリプト実行の安全性を示すカテゴリ CATID_SafeForScripting をそれぞれコントロールが実装しているかどうかを確認します。

コントロールが IObjectSafety をサポートせず、適切なコンポーネント カテゴリを実装しているものとしてコントロール自体を登録していない場合に、Internet Explorer の安全性レベルが高 (デフォルト値) に設定されていると、Internet Explorer はコントロールのプロパティを初期化したり、ページに埋め込まれたスクリプトを実行したりすることはありません。この場合、エンド ユーザーには以下のテキストが示されたダイアログ ボックスが表示されます。
Potential safety violation avoided
This page contains active content that is not verifiably safe to display. To protect your computer, this content will not be displayed.
以下は、Paul Johns の資料「Signing and Marking ActiveX Controls」から引用したガイドラインの一覧です。
  • コントロールはファイル システム操作を行わない。
  • コントロールはレジストリ操作を行わない (コントロール自体の登録および登録解除を除く)。
  • コントロールは overindex 配列またはその他を使用して不適切なメモリ操作を行わない。
  • コントロールは、初期化、メソッドのパラメータ、およびプロパティ設定関数を含む、すべての入力を検証 (および訂正) する。
  • コントロールは、ユーザーが提供したデータや、そのユーザーに関するデータを誤用しない。
  • コントロールはさまざまな状況でテストされている。
関連情報については、以下のマイクロソフト Web サイトを参照してください。
Signing and Marking ActiveX Controls
http://msdn2.microsoft.com/en-us/library/ms974305.aspx
コントロールの作成者が、上記の条件およびその他の考えられる条件を満たしていることを確認した場合、IObjectSafety をサポートする方法と、適切なコンポーネント カテゴリを実装しているものとしてコントロールを登録する方法の両方を考慮する必要があります。これらの方法それぞれの長所および短所の一覧については、Paul Johns の資料「Signing and Marking ActiveX Controls」の該当する項を参照してください。

コンパイル方法

サンプルをビルドするには、Microsoft Visual C++ 5.0 または Microsoft Visual C++ 6.0 が必要です。アーカイブからファイルを抽出した後で、プロジェクト Safectl.mdp を Microsoft Developer Studio に読み込んでビルドします。ビルド処理の中で、コントロールを登録する必要があります。

警告 : 以下に示す 2 つのプリプロセッサ シンボルを使用してサンプルを変更する前に、コントロールがコンピュータに既にビルドまたは登録されている場合は、その登録を解除する必要があります。この操作を行うには、既存のコントロールに対して /u スイッチを使用して Regsvr32.exe を実行します。また、Microsoft Developer Studio にカスタム ツール エントリを追加し、現在のプロジェクトに対してこの処理を実行することもできます。[ツール] メニューの [カスタマイズ] をクリックし、[ツール] タブをクリックします。以下の情報を使用して新しいエントリを作成します。
               名前 : &Un-register ActiveX Control
          コマンド : e:\Program Files\DevStudio\SharedIDE\BIN\REGSVR32.EXE
             引数 : /u /v "$(TargetPath)"
   初期ディレクトリ : $(TargetDir)
				
サンプル固有のプリプロセッサ定義の追加または削除を行う前に、この時点で tools/Un-register ActiveX Control エントリを使用して、コントロールの登録を解除することができます。

初期化の安全性を示すコンポーネント カテゴリおよびスクリプト実行の安全性を示すコンポーネント カテゴリを実装するものとしてコントロール自体を登録するようにコントロールをビルドするには、以下の手順を実行します。
  1. [プロジェクト] メニューの [設定] をクリックします。
  2. [C++] タブをクリックし、以下のプリプロセッサ定義を実行します。
    L_USE_COMCAT
  3. [OK] をクリックし、[設定] ダイアログ ボックスを閉じて、コントロールを再ビルドします。
IObjectSafety を実装するようにコントロールをビルドするには、上記の手順で L_USE_COMCAT を L_IMPL_OBJECTSAFETY に置き換えて実行します。

また、両方のプリプロセッサ シンボルを定義することもできます。これらのシンボルがこのプロジェクト固有のものであることに注意してください。デフォルトでは、プロジェクトのビルド設定によって、両方のプリプロセッサ シンボルが定義されます。

実行方法

サンプル コントロールがビルドされて正常に登録されたら、Internet Explorer を起動して、サンプルに含まれている Safectl.htm ページを開きます。

安全なものとしてコントロール自体を登録するか、または IObjectSafety を実装するようにコントロールが構成されている場合、コントロールのキャプションに "Safe for initializing!" と表示されます。コントロールをクリックすると、以下のメッセージが表示されます。
I must be safe for scripting!
Internet Explorer の安全性レベルが高に設定されている場合は、関連するスクリプトが実行されず、以下のメッセージが表示されます。
NOT safe for initializing!


: このサンプルを異なる構成でビルドしてテストする場合は、必ずブラウザで Web ページを更新します。ページを更新しない場合は、最新のビルドではなく、キャッシュ内のコントロールを使用していることがあります。

関連情報

安全な API の詳細については、ActiveX SDK オンライン ドキュメントの「Safety API」を参照してください。

コード署名の詳細については、ActiveX SDK オンライン ドキュメントの「Signing with Microsoft Authenticode Technology」を参照してください。

コンポーネント カテゴリの詳細については、ActiveX SDK オンライン ドキュメントの「Component Categories」を参照してください。

MFC で COM (Component Object Model) インターフェイスを実装する方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
141277 Visual C++ を使用して MFC アプリケーションのインターフェイスをオーバーライドする方法
ActiveX コントロールの開発方法および Web への展開方法の詳細については、以下のマイクロソフト Web サイトを参照してください。
The ABCs of MFC ActiveX Controls
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaxctrl/html/msdn_abcsmfc.asp

プロパティ

文書番号: 164119 - 最終更新日: 2011年9月22日 - リビジョン: 3.0
この資料は以下の製品について記述したものです。
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 6.0
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
キーワード:?
kbdownload kbfile kbinfo kbsample KB164119
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com