【问题标题】:How can I block loading remote content in DotNetBrowser?如何阻止在 DotNetBrowser 中加载远程内容?
【发布时间】:2021-02-11 00:03:49
【问题描述】:

我在WPF 电子邮件应用程序中使用DotNetBrowser 来显示电子邮件内容。我想阻止所有远程内容和远程图像。我使用这个email privacy tester 来检查我是否可以正确阻止远程内容。

我检查了DotNetBrowser 的文档,发现可以使用BrowserPreferences 设置禁用一些东西。我使用以下代码禁用了所有功能:

BrowserPreferences pref = new BrowserPreferences {
    ImagesEnabled = false,
    JavaScriptEnabled = false,
    PluginsEnabled = false,
    WebAudioEnabled = false,
    ApplicationCacheEnabled = false,
    LocalStorageEnabled = false,
    AllowDisplayingInsecureContent = false,
    AllowRunningInsecureContent = false,
    ...
};

wpfBrowserView.Browser.Preferences = pref;
wpfBrowserView.Browser.LoadHTML(myHtml);

但这只是阻止了几个可能的有害内容。然后我设置了一个自定义LoadHandler,我可以在其中防止更多情况:

MyBrowserLoadHandler loadHandler = new MyBrowserLoadHandler();
loadHandler.Load += args => {
    // just don't allow to load the content
};
wpfBrowserView.Browser.LoadHandler = loadHandler;

这还不够,因为其中两个(Link PrefetchCSS link tag)仍然失败。

我也不想对电子邮件的 html 进行静态分析来处理这些情况,所以我正在寻找一种更简单的方法来做这件事。例如,在 Android 的 WebView 中,只需调用两个方法(setBlockNetworkLoads(true)setBlockNetworkImage(true))就可以完成全部工作。 DotNetBrowser有这样的解决方案吗?

【问题讨论】:

    标签: wpf email privacy dotnetbrowser


    【解决方案1】:

    我终于找到了解决方案。我放弃了上面发布的所有尝试,并尝试了另一种方法。 DotNetBrowser 有一个resource handler,您可以设置您希望允许加载的资源类型以及不允许加载的资源类型。这是我的代码:

    var network = wpfBrowserView.Browser.Context.NetworkService;
    var resourceHandler = new MyResourceHandler();
    resourceHandler.Load += args => {
        ResourceType resource = args.Parameters.ResourceType;
    
        switch (resource) {
            case ResourceType.PREFETCH:
            case ResourceType.IMAGE:
            case ResourceType.MEDIA:
            case ResourceType.OBJECT:
            case ResourceType.STYLESHEET:
            case ResourceType.FONT_RESOURCE:
            case ResourceType.SUB_RESOURCE:
                return false;
            default:
                // allow to load for the others
                return true;
        }
    };
    
    network.ResourceHandler = resourceHandler;
    

    还有自定义资源处理程序:

    public class ResourceLoadEventArgs {
        public ResourceParams Parameters { get; set; }
    }
    
    public delegate bool ResourceLoadHandler(ResourceLoadEventArgs args);
    
    public class MyResourceHandler : ResourceHandler {
        public event ResourceLoadHandler Load;
    
        public bool CanLoadResource(ResourceParams parameters) {
            return Load?.Invoke(new ResourceLoadEventArgs { Parameters = parameters }) ?? true;
        }
    }
    

    因此,在将 html 加载到浏览器视图之前添加这段代码,它会导致通过电子邮件隐私测试器中的每个测试。然后你可以放一个按钮让用户加载远程内容,当用户点击它时,你可以允许每个资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2015-10-11
      • 2017-06-27
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多