gpt4 book ai didi

c# - WebBrowser 控件和嵌入标记

转载 作者:可可西里 更新时间:2023-11-01 08:28:43 27 4
gpt4 key购买 nike

我认为我遇到了与在我的 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 安全设​​置有关,但我注意到我对嵌入内容设置了完全权限。也许控件没有正确识别页面的来源,因此不允许使用嵌入标记。

我如何以编程方式解决这个问题?我想避免将我的页面写入文件,并不惜一切代价导航到该文件。关于如何欺骗浏览器控件使其正常工作的任何建议?

第一编辑:

根据这篇文章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

问题在于跨域安全恶作剧。参见 THIS IE8 决定无法写入 Document.Domain。即使它是可写的,您显然也永远无法在协议(protocol)之间进行通信。所以“file://”协议(protocol)和“about”协议(protocol)不能通信,或者标签指向彼此。以下是绊脚石:

  • 浏览器控件使用的 IE 版本无法执行任何操作Document.Domain,甚至不使用 JavaScript。
  • 您无法读取 about:blank 的域。
  • 您无法加载具有正确域的页面,并期望使用Document.Write 将 HTML 写入其中,因为你被迫调用使用 Document.Write 之前的 Document.OpenNew。
  • 您不能使用 WebBrowser.DocumentText = 修改 DocumentText任何 因为每次导航只能设置一次 DocumentText。这就像其他一些安全东西

总而言之,可以说您对 WebBrowser 控件的安全性没有任何额外的控制,甚至可能比您对某些 JavaScript 生成的页面(因为这些页面共享启动脚本的域)的控制更少.

感谢您对我的努力的投票/支持,但看起来每次我想更改浏览器控件中的内容时,我都将放弃并写一个页面来归档。呸。

最佳答案

问题在于跨域安全恶作剧。参见 THIS IE8 决定无法写入 Document.Domain。即使它是可写的,您显然也永远无法在协议(protocol)之间进行通信。所以“file://”协议(protocol)和“about”协议(protocol)不能通信,或者标签指向彼此。以下是绊脚石:

  • 浏览器控件使用的 IE 版本无法执行任何操作Document.Domain,甚至不使用 JavaScript。
  • 您无法读取 about:blank 的域。
  • 您无法加载具有正确域的页面,并期望使用Document.Write 将 HTML 写入其中,因为你被迫调用使用 Document.Write 之前的 Document.OpenNew。
  • 您不能使用 WebBrowser.DocumentText = 修改 DocumentText任何 因为每次导航只能设置一次 DocumentText。这就像其他一些安全东西

总而言之,可以说您对 WebBrowser 控件的安全性没有任何额外的控制,甚至可能比您对某些 JavaScript 生成的页面(因为这些页面共享启动脚本的域)的控制更少.

感谢您对我的努力的投票/支持,但看起来每次我想更改浏览器控件中的内容时,我都将放弃并写一个页面来归档。呸。

关于c# - WebBrowser 控件和嵌入标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com