首页 文章

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

提问于
浏览
4

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

  • CLSID_WebBrowser

  • 8856F961-340A-11D0-A96B-00C04FD705A2

  • Shell.Explorer.2

不幸的是,在Windows服务器上运行时, Internet Explorer Enhanced Security 模式会干扰 WebBrowser 控件,导致它根本无法渲染:

在这种情况下,软件的UI作为 WebBrowser 控件驱动 - 使软件无法使用 .

我可以disable Internet Explorer Enhanced Security mode,但那不切实际 .

如何指示Internet Explorer浏览器允许嵌入式浏览器在没有安全对话框的情况下进行渲染?

Note: 我本来建议将 about:security_Application.exe 添加到 Trusted Zones 列表中“

遗憾的是,这将需要DRP / FRP验证,ISO安全评估,并且必须调用安全组来进行更改 . 此外,还需要创建一个RFC,以便毕马威不会进行下一次审计 . 我希望得到"good"解决方案 .

另见

2 回答

  • 1

    您可以指定其他URL . 例如,您可以将内容提取到临时文件并导航到该文件 . 这不会将您的内容放在受信任的区域中,但它比您为about协议获得的Internet区域更好 .

    如果您不想保存内容,可以先导航到about:blank,然后在DocumentComplete中,QI文档为IPersistMoniker,并使用基本模拟url名字对象的TInterfacedObject调用Load .

    还有第三种方法,写一个process-wide security manager,将你的网址放在一个受信任的区域 .


    解决方案是实现您自己的Internet Security Manager服务,创建一个实现IInternetSecurityManager的对象(请参阅MSDN: Implementing a Custom Security Manager) . 有五个安全区域:

    • 当地: 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

    如果是,则返回该区域应为 Local

    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;
    

    每隔一个方法 must 返回 INET_E_DEFAULT_ACTION (即不是S_OK也不是E_NOTIMPL),例如:

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

    您在调用IServiceProvider.QueryService时为嵌入式WebBrowser提供此服务 . 对于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;
    
  • 0

    也许你可以考虑加载一个不同的嵌入式浏览器 . 有:

相关问题