如何在使用嵌入式WebBrowser控件时绕过Internet Explorer增强安全功能?

6

我有一个本地的Windows应用程序,嵌入了WebBrowser,即

  • CLSID_WebBrowser
  • 8856F961-340A-11D0-A96B-00C04FD705A2
  • Shell.Explorer.2

很不幸,当在Windows服务器上运行时,Internet Explorer增强安全模式会干扰WebBrowser控件,导致其完全无法呈现:

enter image description here

在这种情况下,软件的用户界面是由一个名为 WebBrowser 的控件驱动 - 这使得软件无法使用。
我可以禁用 Internet Explorer 增强安全性 模式,但这并不实际。
如何指示 Internet Explorer 浏览器允许嵌入式浏览器在没有安全对话框的情况下呈现? 注意: 我建议将 about:security_Application.exe 添加到受信任站点列表中。

enter image description here

很遗憾,这将需要DRP/FRP验证、ISO安全评估,并且必须调用安全组进行更改。此外,还需要创建RFC,以便KPMG在下次审计时不会发脾气。我本来希望能有一个“好的”解决方案。

另请参阅

2个回答

1

您可以指定不同的URL。例如,您可以将内容提取到临时文件中并导航到该文件。这不会将您的内容放入受信任的区域,但比about协议获得的互联网区域更好。

如果您不想保存内容,可以先导航到about:blank,然后在{{link1:DocumentComplete}}中,QI文档以获取{{link2:IPersistMoniker}},并使用基本上模拟url moniker的TInterfacedObject调用Load。

  1. IMoniker.GetDisplayName 的实现需要返回 URL。URL 需要在受信任的区域内。
  2. IMoniker.BindToStorage 的实现需要在 IStream 被请求时返回对 TMemoryStream 的引用。

还有第三种方法,编写一个进程级安全管理器,将您的 URL 放入受信任的区域中。


解决方案是实现自己的Internet安全管理器服务,创建一个实现IInternetSecurityManager接口的对象(参见MSDN:实现自定义安全管理器)。有五个安全区域:

  • 本地:URLZONE_LOCAL_MACHINE(0)
  • 内部网:URLZONE_INTRANET(1)
  • 受信任的:URLZONE_TRUSTED(2)
  • 互联网:URLZONE_INTERNET(3)
  • 受限制的:URLZONE_UNTRUSTED(4)

你真正需要关心的唯一方法是MapUrlToZone

TEmbeddedSecurityManager = class(TInterfacedObject, IInternetSecurityManager)
public
   //...
   function MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD; dwFlags: DWORD): HResult; virtual; stdcall;
   //...
end;

此方法检查Url是否以about:security开头。

about:security_Contoso.exe

如果是这样,则返回该区域应为“本地”:

function TEmbeddedSecurityManager.MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD; dwFlags: DWORD): HResult;
var
    url: UnicodeString;
begin
    Result := INET_E_DEFAULT_ACTION;

    {
        https://msdn.microsoft.com/en-us/library/ms537133(v=vs.85).aspx
    }
    url := pwszUrl;
    {
        When IE Enchanced Security is enabled, the url goes from 
            about:blank_xxxx
        to 
            about:security_xxxx

        In that case we will put the page in the "Local" zone
    }
    if url.StartsWith('about:security') then
    begin
        dwZone := URLZONE_LOCAL_MACHINE; //Local
        Result := S_OK;
    end;
end;

每个其他的方法必须返回INET_E_DEFAULT_ACTION(即不是S_OK也不是E_NOTIMPL),例如:

function TEmbeddedSecurityManager.SetSecuritySite(Site: IInternetSecurityMgrSite): HResult;
begin
    Result := INET_E_DEFAULT_ACTION;
end;

当嵌入式WebBrowser调用IServiceProvider.QueryService时,您为其提供此服务。对于Delphi的TEmbeddedWB控件,它在OnQueryService事件中公开:

function TForm1.EmbeddedWBQueryService(const rsid, iid: TGUID; out Obj: IInterface): HRESULT;
var
    sam: IInternetSecurityManager;
begin
    Result := E_NOINTERFACE;

    //rsid ==> Service Identifier
    //iid ==> Interface identifier
    if IsEqualGUID(rsid, IInternetSecurityManager) and IsEqualGUID(iid, IInternetSecurityManager) then
    begin
        sam := TEmbeddedSecurityManager.Create;
        Obj := sam;
        Result := S_OK;
    end;
end;

我目前从一个 IStream 中加载页面。 - Ian Boyd

0

也许您可以考虑加载不同的嵌入式浏览器。 有:


我认为它们不支持嵌入;至少我没有看到相关文档。另外,我需要将其编译成本地可执行文件(外部 DLL 不行)。因此,我需要重新编写大量代码。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接