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

标签 webbrowser-control twebbrowser iwebbrowser2

我有一个嵌入 WebBrowser 的 native Windows 应用程序, IE。

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

  • 不幸的是,在 Windows 服务器上运行时, Internet Explorer Enhanced Security 模式干扰 浏览器 控制,导致它根本不渲染:

    enter image description here

    在这种情况下,软件的 UI 被驱动为 浏览器 控制 - 使软件无法使用。

    我可以 disable Internet Explorer Enhanced Security mode ,但这并不实用。

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

    注:我会建议添加 about:security_Application.exe可信区域 列表”

    enter image description here

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

    也可以看看
  • Customizing (disabling) security settings for IE control
  • Custom IInternetSecurityManager not being called with dialogs
  • 最佳答案

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

    如果不想保存内容,可以先导航到about:blank,然后在DocumentComplete , QI 文件为 IPersistMoniker ,并使用基本上模拟 url moniker 的 TInterfacedObject 调用 Load。

  • IMoniker.GetDisplayName 实现需要返回 URL。 url 需要位于受信任的区域中。
  • 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 开头

    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;
    

    关于webbrowser-control - 使用嵌入式 WebBrowser 控件时如何绕过 Internet Explorer 增强安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997720/

    相关文章:

    delphi - TWebBrowser:禁用所有安全限制

    delphi - 如何以编程方式更改 TWebBrowser 中的字体

    c++ - 如何将 WM_KEYDOWN 消息传递给 IWebBrowser2 实例?

    windows - IWebBrowser2对象使用IE7版本,而不是机器上安装的IE版本

    winforms - WebBrowser 控件不会显示同一台 PC 上的 IE8 会显示的 https 站点

    c# - Windows 窗体 Web 浏览器控制缩放级别

    delphi - 如何让 TWebBrowser 忽略其他控件的加速器字符?

    c++ - 通过 IWebBrowser2 接口(interface)检测是否启用 cookie

    c# - WebBrowser 控件更改属性