Używam aplikacji DotNetBrowser w aplikacji e-mail z e-mailem, aby wyświetlić treść wiadomości e-mail. Chciałbym zablokować każdą zdalną zawartość i zdalne obrazy. Używam tego E-mail Tester prywatności, aby sprawdzić, czy mogę poprawnie zablokować zawartość zdalnego.

Sprawdziłem dokumentację DotNetBrowser i odkryłem, że możliwe jest wyłączenie kilku rzeczy za pomocą ustawienia {x1}}. Wyłączyłem wszystko z następującym kodem:

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);

Ale to blokuje tylko kilka możliwych szkodliwych treści. Potem ustawiłem niestandardowy LoadHandler, gdzie mogłem zapobiec kilku większej liczbie przypadków:

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

To nie wystarczy, ponieważ nadal nie powiedzie się z nich (Link Prefetch i CSS link tag).

Nie chcę robić analizy statycznej na HTML e-mail, aby obsługiwać te przypadki, więc szukam łatwiejszego sposobu na to. Na przykład w Webviewu Android, to tylko dwie metody, aby zadzwonić (setBlockNetworkLoads(true) i setBlockNetworkImage(true)) i robi całą rzeczą. Czy jest takie rozwiązanie w DotNetBrowser?

1
Attila Szász 28 październik 2020, 18:22

1 odpowiedź

Najlepsza odpowiedź

Wreszcie znalazłem rozwiązanie. Wyrzuciłem wszystkie moje próby, co opublikowałem powyżej, i próbowałem inny sposób. DotNetBrowser ma Handler zasobów i możesz ustawić jakiegą zasobów, które chcesz zezwolić na załadowanie i co nie. Oto mój kod:

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;

I niestandardowy przewodnik zasobów:

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;
    }
}

Tak więc dodanie tego kodu przed załadowaniem HTML do widoku przeglądarki, powoduje, że przekazuje każdy test w testerze prywatności wiadomości e-mail. Następnie możesz umieścić przycisk użytkownika, aby załadował zawartość zdalnego, a gdy użytkownik kliknie go, możesz zezwolić na każdy zasób.

1
Attila Szász 29 październik 2020, 10:48