【问题标题】:How to bypass Internet Explorer Enhanced Security when using embedded WebBrowser control?使用嵌入式 WebBrowser 控件时如何绕过 Internet Explorer 增强安全性?
【发布时间】:2012-12-21 21:57:52
【问题描述】:

我有一个嵌入 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 浏览器允许嵌入式浏览器在没有安全对话框的情况下呈现?

注意:我会建议将about:security_Application.exe 添加到信任区域列表”

遗憾的是,这将需要 DRP/FRP 验证、ISO 安全评估,并且必须调用安全组来进行更改。此外,还需要创建一个 RFC,这样 KPMG 就不会进行 hissy-fit 下一次审计。我希望 “好” 解决方案。

另见

【问题讨论】:

    标签: webbrowser-control twebbrowser iwebbrowser2


    【解决方案1】:

    您可以指定不同的 URL。例如,您可以将内容提取到临时文件并导航到它。这不会将您的内容放入受信任区域,但它比您通过 about 协议获得的 Internet 区域要好。

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

    1. IMoniker.GetDisplayName 实现需要返回 URL。该网址需要位于受信任的区域中。
    2. IMoniker.BindToStorage 实现需要在请求 IStream 时发回对 TMemoryStream 的引用。

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


    解决方案是实现您自己的 Internet 安全管理器服务,创建一个实现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

    开头

    关于: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加载页面。
    【解决方案2】:

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

    【讨论】:

    • 我不认为那些支持嵌入;在休假时,我没有看到任何文件。此外,我需要它编译成我的本机可执行文件(外部 dll 不会这样做)。所以我不得不重写一大堆代码。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多