はじめに
Windowsフォームアプリケーションでは、[Microsoft Web Browser]コントロールを使用して簡単にブラウザ機能を追加し、HTMLを表示することができます。しかし、デフォルトのままではHTML内のスクリプトやActiveXコントロールが実行されてしまいます。IInternetSecurityManager
を実装すると、スクリプトやActiveXコントロールの実行許可・不許可を制御することができるようになります。
対象読者
Windowsフォームアプリケーションで[Microsoft Web Browser]コントロールを使用している方を対象にしています。この記事の内容を完全に理解するにはCOMInteropやWin32 APIの知識が必要になりますが、コードを利用するだけであれば通常のC#/VB.NETの知識で十分応用可能だと思います。
必要な環境
サンプルはVisual Studio .NET 2003で作成し、.NET Framework 1.1で動作確認をしていますが、.NET Framework 1.0でも問題なく動作するでしょう。
Web Browserコントロールを使用したアプリケーション
Visual Studio .NET 2003では、簡単にブラウザ機能を追加することができます。Visual Studio .NETの[ツールボックス]に[Microsoft Web Browser]コントロールが存在しない場合は、以下の手順で追加することができます。
- [ツールボックス]上で右クリックし、[アイテムの追加と削除...]を選択します。
- [ツールボックスのカスタマイズ]ダイアログボックスの[COM コンポーネント]タブで、[Microsoft Web Browser](shdocvw.dll)を追加します。
それではサンプルとして、とても単純なアプリケーションを作成してみます。サンプルファイルのソースコードの「WebBrowserSecurity01」フォルダに、実際に作成したソースコードが入っています。
上記のようにURLを入力するテキストボックスとラベル、[移動]ボタン、そして[Microsoft Web Browser]コントロールをフォーム上に配置します。クライアント領域の大部分を占めるまっ白な部分が[Microsoft Web Browser]コントロールです。コントロールを配置できたら、[移動]ボタンのクリックイベントに以下のようなコードを記述します。
private void button1_Click(object sender, System.EventArgs e) { object v = System.Reflection.Missing.Value; this.axWebBrowser1.Navigate( this.textBox1.Text, ref v, ref v, ref v, ref v); }
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Me.AxWebBrowser1.Navigate(Me.TextBox1.Text) End Sub
これで最低限のブラウズ機能を持つサンプルアプリケーションは完成です。アプリケーションを実行し、テキストボックスに適当なURLを入力して「移動」ボタンをクリックしてください。[Microsoft Web Browser]コントロールのNavigate
メソッドが呼び出され、そのページが表示されます。ためしに「http://codezine.jp/」を表示したのが以下の図です。
Web Browserコントロール上のスクリプトとActiveXコントロール
[Microsoft Web Browser]コントロールは、Microsoft Internet Explorer(以下「IE」と略します)の機能を、ほぼすべて持っています。むしろIEは、[Microsoft Web Browser]コントロールに、メニューやステータスバーなどといった飾りを付けたものだと言ってもよいのかもしれません。ということは、[Microsoft Web Browser]コントロールにも、JavaScriptやActiveXコントロールを実行する機能が含まれているということになります。以下のHTMLを「C:\test.htm」として保存し、上記で作ったサンプルアプリケーションで表示してみましょう。
<html> <head> <script language="javascript"> function DoAlert() { alert('alert!(function)'); } </script> </head> <body> <form> <input type="button" value="クリックでアラートを表示(function)" onclick="DoAlert();" /> <p /> <input type="button" value="クリックでアラートを表示(inline)" onclick="alert('alert!(inline)');" /> <p /> <object id="mediaplayer" classid="clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95" width="200" height="200"> <param name="filename" value="c:\windows\clock.avi" /> </object> </form> </body> </html>
ボタンを押すと、JavaScriptを使用してアラート(メッセージボックス)が表示されますし、MediaPlayer ActiveXコントロールも問題なく実行されます(上記のHTMLでは「c:\windows\clock.avi」という動画ファイルが存在することを前提としています)。
さて、これらスクリプトやActiveXコントロールの実行を禁止することができるでしょうか? 残念ながら[Microsoft Web Browser]コントロールのプロパティを見回してもそれらしいものはありません。実はIInternetSecurityManager
というCOM interfaceを使って制御を行えるようになっています。以下ではこのIInternetSecurityManager
を使用して、スクリプトやActiveXコントロールの実行許可・不許可を制御する方法を解説します。