【问题标题】:How to block downloads in .NET WebBrowser control?如何阻止 .NET WebBrowser 控件中的下载?
【发布时间】:2009-01-27 12:42:11
【问题描述】:

我需要阻止 .NET WebBrowser 控件显示任何“您要打开还是保存此文件?”和“另存为”对话框。相反,我想显示一个消息框,告诉用户出于安全原因已禁用文件下载。

我从WebBrowserFileDownload 事件开始,但它不允许取消。然后,我使用CodeProject: Extended .NET 2.0 WebBrowser Control 中的方法,使用接口DWebBrowserEvents2 在原始COM 调用的基础上实现我自己的事件。当我根据an MS knowledge base entry about a bug with the FileDownload signature 修复代码时,事件处理程序被调用并且我能够取消下载。

这不适用于所有下载,但是:指向包含.exe 的 URL 的下载 URL 会引发事件,并且可以在对话框出现之前取消 - 但对于其他人(如 .do),事件处理程序不是直到用户在对话框中单击OpenSaveCancel

一个可能的解决方案可能是intercept WH_CALLWNDPROCRET messages and 'answer' the dialog before it is shown to the user,但这听起来很费力,我也更喜欢更清洁的解决方案......

有人知道如何可靠地阻止所有下载吗?

【问题讨论】:

  • 让我明白这一点...您想允许您的用户访问互联网(这只不过是将文件下载到计算机中)并且您想阻止所有下载?
  • @Sergio:我想,Jens 想要阻止所有文件,这些文件不能直接在 webbrowser 中显示。
  • TcKs 是对的,我要屏蔽所有不能显示的东西。关键不是要阻止下载,而是要阻止显示任何“将文件另存为”对话框,使用户无法访问硬盘。我的应用程序安装为 windows shell(没有资源管理器,没有开始菜单)。

标签: .net browser download


【解决方案1】:

您可以使用允许取消的Navigating 事件。

在此事件中,您可以尝试连接到自己正在导航的 URL,检查 http 响应标头并在检测到不适当的 ContentType 时取消导航。

System.Net.WebRequest request = System.Net.WebRequest.Create(e.Url);

// we need only header part of http response
request.Method = "HEAD";

System.Net.WebResponse response = request.GetResponse();

// only text/html, text/xml, text/plain are allowed... extend as required
if (!response.ContentType.StartsWith("text/"))
{
  e.Cancel = true;
  MessageBox.Show("Not allowed for security resons...");
}

显然这不是万无一失的解决方案,但可以让您了解如何开始(如果您不介意为了检索 http 响应标头而进行额外的微小往返)。

延斯·班曼写道:

这并不理想,因为我正在处理 额外的网络应用程序 请求可能会触发一个动作 执行了两次:-(

然后我会创建一些简单的代理服务器来检查所有接收到的数据,并过滤掉所有可能触发 Web 浏览器控件中“另存为”对话框的 http 响应。

简单地说,不要让您的网络浏览器控制直接访问互联网,而是将所有 http 请求委托给您的特殊代理服务器,该代理服务器将过滤掉来自网络的所有不安全响应。

【讨论】:

  • 嗯,连接代理而不是以某种方式阻止/禁用对话框并不是一个优雅的解决方案。无论如何,我是否可以在不安装其他软件的情况下添加代理,即仅使用 .NET 框架?
  • 我认为这是一个非常优雅的解决方案并且很有意义。此外,您的代码不会突然与 IE 的未来版本中断。您可以在自己的软件中实现简单的代理服务器。如果你不知道怎么做,再发一个问题,你会得到更多的答案。
  • 代理无法可靠地工作,因为它无法看到 https 连接的 url 或标头。
【解决方案2】:

似乎唯一可靠的方法是挂接到 Windows 事件队列并抑制对话框(因为各种事情都可以让用户访问)。这就是我们的助手类所做的:

    void ListenForDialogCreation()
    {
        // Listen for name change changes across all processes/threads on current desktop...
        _WinEventHook = WinAPI.SetWinEventHook(WinAPI.EVENT_OBJECT_CREATE, procDelegate);
    }
    void StopListeningForDialogCreation()
    {
        WinAPI.UnhookWinEvent(_WinEventHook);
    }

    void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        const uint OBJID_WINDOW = 0;
        const uint CHILDID_SELF = 0;

        // filter out non-HWND, and things not children of the current application
        if (idObject != OBJID_WINDOW || idChild != CHILDID_SELF)
            return;

        //Get the window class name
        StringBuilder ClassName = new StringBuilder(100);
        WinAPI.GetClassName(hwnd, ClassName, ClassName.Capacity);

        // Send close message to any dialog
        if (ClassName.ToString() == "#32770")
        {
            WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero);
            if (OnDialogCancelled != null)
                OnDialogCancelled();
        }
        if (ClassName.ToString() == "#32768")
        {
            WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero);
            if (OnDialogCancelled != null)
                OnDialogCancelled();
        }

    }

    public delegate void OnDialogCancelledEvent();
    public event OnDialogCancelledEvent OnDialogCancelled;
  • #32770 是 Dialog 类
  • #32768 是弹出菜单
  • WinAPI 命名空间是我们的 pinvoke 包装器。

如果您不想阻止所有对话框,则需要在捕获课程后添加一些额外的过滤器。这取决于您需要有多安全。在 $WORK,我们需要阻止所有上传和下载。

抑制弹出菜单是必要的,因为它可以访问帮助应用程序,该应用程序提供指向微软网站的链接,从而可以启动一个完整的 IE 实例。然后他们可以为所欲为。

【讨论】:

  • 好吧,如果您添加了 WinAPI 类代码,这篇文章可能会有所帮助。 =(
  • 已经有一段时间了,但我想我们只是使用 pinvoke.net 来创建我们需要的包装器。
【解决方案3】:

这个项目 - http://www.codeproject.com/Articles/157329/Http-Monitor-for-Webbrowser-Control 允许拦截和检查来自 WebBrowser 控件的 HTTP 流量。

然后你可以通过 MIME 过滤数据,只允许 html、图像、脚本等。

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多