13

C# 2008 WinForms アプリケーションで、埋め込みタグを WebBrowser コントロールで使用することに関連するセキュリティ上の問題があると思います。

これが私のコードです:

private void button2_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("C:/page1.html");
}

private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("about:blank");
    Thread.Sleep(1000);
    webBrowser1.Document.Write("<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>");
}

これは page1.html の内容です:

<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>

Button1 は「Hello」という単語を生成します。Button2 は、「Hello」という単語を生成し、その下にムービー プレーヤーが埋め込まれています。

両方のページのソースを表示すると、ソース ファイルの名前を除いて同一であることがわかります。

これは、IE のセキュリティ設定に関係していると思われますが、埋め込みコンテンツに対して完全なアクセス許可が設定されていることに気付きました。コントロールがページのソースを適切なものとして認識しないため、embed タグの使用が許可されない可能性があります。

これをプログラムでどのように克服できますか?ページをファイルに書き込み、そのファイルに移動することは絶対に避けたいです。ブラウザ コントロールをだまして正しく動作させる方法について何か提案はありますか?

第一編集者:

この記事Webbrowser Navigate Embedded Resourceによると、これは機能しますが、私 (JT) は試しましたが、機能しませんでした:

System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApplication1.Properties.test.html");
webBrowser1.DocumentStream = stream;

問題の再現中の奇妙な動作:

webBrowser1.Navigate("about:blank");
do
{
Thread.Sleep(100);
} while (webBrowser1.IsBusy == true);

//Method 1. Doesn't work
string htmlString1 = File.ReadAllText("C:/page1.html");
webBrowser1.Document.Write(htmlString1);

//Method 2. Doesn't work
string htmlString2 = "<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>";
webBrowser1.Document.Write(htmlString2);

//Method 3. DOES WORK
webBrowser1.Document.Write("<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>");

編集 2

以下は、実際のソース ファイルを使用せずに JavaScript で作成されたページの例で、IE に埋め込まれたプレーヤーを表示します。

<html><head>
<script language="JavaScript">
function go()
{
test1 = window.open("","","menubar=0,status=0,toolbar=0");
test1.document.writeln("<html><body><p>Hello</p><embed src='test.wmv' /></body></html>");
}
</script>
</head><body><h1 onclick="go()">click</h1></body></html>

ここでの唯一の違いは、IE が HTML のソースをファイルと見なすことですが、それは "writeln" によって作成されます。

IE はタグをサポートしていないというのが一般的な意見ですが、サポートしており、それを証明する多くの例があります。IE で jsfiddle.net で IE を使用しようとすると、埋め込みプレーヤーが生成されますが、FFでは生成されません

編集 3

この問題は、クロスドメイン セキュリティに関連しています。新しいバージョンの IE では、ページが存在するとそのドメインへの変更が許可されないだけでなく、WebBrowser コントロールでは、既にテキストが含まれているドキュメントにテキストを書き込むことができません。Document.Write への最初の呼び出しだけが何かを行います。ページのドメインを強制する明らかな方法がないだけでなく、書き込みを行うために必要な「openNew」が次のように開くため、ドメインが設定されているページに新しいものを書き込む方法もありません。空白であり、デフォルトでヌル ドメインに設定され、設定または取得が試行された場合に例外が発生します。

編集 4

問題は、クロスドメイン セキュリティの悪ふざけにあります。このIE8 が Document.Domain に書き込めないと判断したことを確認してください。書き込み可能だったとしても、プロトコル間で通信することはできないようです。そのため、"file://" プロトコルと "about" プロトコルは通信できず、互いにタグを指すこともありません。つまずきのブロックは次のとおりです。

  • Browser Control で使用される IE のバージョンは、Document.Domain に対して何もできません。JavaScript でも同様です。
  • about:blank のドメインを読み取ることができません。
  • Document.Write を使用する前に Document.OpenNew を呼び出す必要があるため、適切なドメインでページを読み込むことができず、Document.Write を使用して HTML をページに書き込むことを期待できません。
  • DocumentText はナビゲーションごとに 1 回しか設定できないため、WebBrowser.DocumentText = anythingを使用して DocumentText を変更することはできません。これは、他のセキュリティのようなものです

結論として、WebBrowser コントロールを使用してセキュリティをさらに制御することはできず、JavaScript で生成されたページよりもさらに制御できないと言えます (これらのページは起動スクリプトのドメインを共有するため)。

私の努力に対する投票/サポートに感謝しますが、ブラウザー コントロールの内容を変更するたびに、あきらめてファイルにページを書き込むようです。うん。

4

3 に答える 3

2

問題は、クロスドメイン セキュリティの悪ふざけにあります。このIE8 が Document.Domain に書き込めないと判断したことを確認してください。書き込み可能だったとしても、プロトコル間で通信することはできないようです。そのため、"file://" プロトコルと "about" プロトコルは通信できず、互いにタグを指すこともありません。つまずきのブロックは次のとおりです。

  • Browser Control で使用される IE のバージョンは、Document.Domain に対して何もできません。JavaScript でも同様です。
  • about:blank のドメインを読み取ることができません。
  • Document.Write を使用する前に Document.OpenNew を呼び出す必要があるため、適切なドメインでページを読み込むことができず、Document.Write を使用して HTML をページに書き込むことを期待できません。
  • DocumentText はナビゲーションごとに 1 回しか設定できないため、WebBrowser.DocumentText = anythingを使用して DocumentText を変更することはできません。これは、他のセキュリティのようなものです

結論として、WebBrowser コントロールを使用してセキュリティをさらに制御することはできず、JavaScript で生成されたページよりもさらに制御できないと言えます (これらのページは起動スクリプトのドメインを共有するため)。

私の努力に対する投票/サポートに感謝しますが、ブラウザー コントロールの内容を変更するたびに、あきらめてファイルにページを書き込むようです。うん。

于 2012-06-17T02:36:28.650 に答える
1

@GorchestopherH結果を聞くのは残念です。4 番目の編集を回答として入れたいと思うかもしれません - 50 ポイントの報奨金を完全に失うのは残念です。

もう 1 つの解決策は、別の Web ブラウザ コントロールです: http://code.google.com/p/geckofx/

GeckoFX を使用して C# に Firefox ブラウザーを埋め込む

于 2012-06-17T02:19:44.353 に答える
1

これが理由です:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd562847(v=vs.85).aspx

上記の例は Firefox では機能しますが、Internet Explorer では機能しません。Internet Explorer で表示できる Web ページに Player コントロールを埋め込むには、Windows Media Player コントロールのクラス ID に設定された classid 属性を持つ OBJECT 要素を作成する必要があります。次の例は、Internet Explorer と Firefox の両方で正しく表示できる Web ページに Windows Media Player コントロールを埋め込む方法を示しています。ページ上のスクリプトがブラウザの種類を検出し、適切な OBJECT タグを生成します。

便宜上、次のとおりです。

private void button3_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("about:blank");
    do
    {
        Thread.Sleep(100);
    } while (webBrowser1.IsBusy == true);

    string htmlString1 = File.ReadAllText("C:/test.html");
    webBrowser1.Document.Write(htmlString1);
    return;
}

Test.html の内容:

<OBJECT id="VIDEO" width="320" height="240" 
    style="position:absolute; left:0;top:0;"
    CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"
    type="application/x-oleobject">

    <PARAM NAME="URL" VALUE="c:\test.wmv">
    <PARAM NAME="SendPlayStateChangeEvents" VALUE="True">
    <PARAM NAME="AutoStart" VALUE="True">
    <PARAM name="uiMode" value="none">
    <PARAM name="PlayCount" value="9999">
</OBJECT>
于 2012-06-10T06:07:47.623 に答える