如何阻止在 DotNetBrowser 中加载远程内容?
How can I block loading remote content in DotNetBrowser?
我在 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 Prefetch
和 CSS link tag
)。
我不想对电子邮件的 html 进行静态分析来处理这些情况,因此我正在寻找一种更简单的方法来进行处理。例如,在 Android 的 WebView 中,只需调用两个方法(setBlockNetworkLoads(true)
和 setBlockNetworkImage(true)
),它就完成了所有事情。 DotNetBrowser
中有这样的解决方案吗?
我终于找到了解决办法。我放弃了上面发布的所有尝试,并尝试了另一种方式。 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 加载到浏览器视图之前添加这段代码,它会导致通过电子邮件隐私测试器中的每个测试。然后你可以放一个按钮让用户加载远程内容,当用户点击它时,你可以允许每个资源。
我在 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 Prefetch
和 CSS link tag
)。
我不想对电子邮件的 html 进行静态分析来处理这些情况,因此我正在寻找一种更简单的方法来进行处理。例如,在 Android 的 WebView 中,只需调用两个方法(setBlockNetworkLoads(true)
和 setBlockNetworkImage(true)
),它就完成了所有事情。 DotNetBrowser
中有这样的解决方案吗?
我终于找到了解决办法。我放弃了上面发布的所有尝试,并尝试了另一种方式。 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 加载到浏览器视图之前添加这段代码,它会导致通过电子邮件隐私测试器中的每个测试。然后你可以放一个按钮让用户加载远程内容,当用户点击它时,你可以允许每个资源。