TWebBrowser:禁用所有安全限制

时间:2017-06-20 22:01:11

标签: delphi webbrowser-control twebbrowser

我正在使用Delphi 10.2中的TWebBrowser组件,该组件是从SHDocVW_TLB类型库导入的。

我想使用此Web浏览器浏览受信任环境中的本地文件和文件。但我注意到,由于安全限制,无法通过本地文件(更确切地说:我使用this code将自定义HTML内容加载到浏览器组件中)到LAN或WAN进行AJAX调用。

我的目标是禁用此Web浏览器控件的所有安全限制(我知道存在风险)。

不确定是否还有其他方法,但我认为我必须创建一个自定义的IInternetSecurityManager。在我的研究过程中,我找到了this document by Microsoft,并解释了如何编写这样的SecurityManager。 但我无处可寻找"插入/覆盖"这个自定义的IInternetSecurityManager进入我的TWebBrowser控件。

要完全禁用所有安全限制,我需要做什么? 谢谢你的提示!

1 个答案:

答案 0 :(得分:6)

答案与您在问题中链接的MSHTML documentation相同:

  

托管WebBrowser控件或MSHTML的应用程序

     

WebBrowser Control或MSHTML主机可以创建一个安全管理器(通过实现IInternetSecurityManager接口)来处理对主机很重要的URL操作和策略。其他URL操作和策略将传递给默认安全管理器,以便它可以适当地处理它们。 IInternetSecurityMgrSite接口将用于处理组件中与Windows相关的信息,以便自定义安全管理器可以处理所需的任何用户界面。

     

要创建自定义安全管理器,组件必须实现IInternetSecurityManager接口。自定义安全管理器需要默认安​​全管理器进行操作的任何方法或URL操作都应返回INET_E_DEFAULT_ACTION

     

安全警告:错误地实施IInternetSecurityManager方法可能会危及应用程序的安全性。自定义安全管理器需要默认安​​全管理器进行操作的任何方法或URL操作都应返回INET_E_DEFAULT_ACTION。如果方法未覆盖默认行为并返回指示成功的HRESULT,则操作未处理,并且可能使用户面临特权提升攻击的风险。在继续之前,您应该先查看Security Considerations: URL Security Zones API

     

在嵌入IOleClientSite或MSHTML时,组件还必须实现支持WebBrowser Control接口的对象。

     

对于URL操作,会发生以下步骤。

     
      
  1. MSHTML使用CoCreateInstance创建Internet Security Manager的实例。

  2.   
  3. Internet Security Manager调用MSHTML上的QueryInterface方法获取其IServiceProvider接口。 MSHTML然后调用IOleClientSite界面上的QueryInterface方法获取IServiceProvider界面

  4.   
  5. IServiceProvider::QueryService被调用以获得IInternetSecurityManager界面。然后,组件将指向其IInternetSecurityManager的实现的指针传递给Internet Security Manager

  6.   
  7. 从MSHTML到IInternetSecurityManager方法的调用将从默认的Internet Security Manager传递到自定义安全管理器。

  8.   
  9. 如果调用的方法返回INET_E_DEFAULT_ACTION,则使用IInternetSecurityManager的默认实现来解析调用。否则,将返回自定义安全管理器的结果。

  10.   
  11. Internet Security Manager会将结果返回给MSHTML。

  12.   

所以,首先你需要编写一个实现IInternetSecurityManager接口的类。

第二,幸运的是TOleControlTWebBrowser派生的)至少从Delphi 2006开始实现IOleClientSiteIServiceProvider接口,所以你需要做的就是分配公共ServiceQuery事件的处理程序,当MSHTML调用IServiceProvider.QueryService()查找IInternetSecurityManager时,您可以返回自定义安全管理器类的实例。

对于较旧的Delphi版本,您可以通过查询IOleObject接口的IOleClientSite属性手动向TWebBrowser提供DefaultInterface对象,然后调用{{3 }} 方法。下面这篇文章就是一个例子:

IOleObject.SetClientSite()

TWebBrowser提供自定义IOleClientSite,您还可以提供自己的自定义How to customise the TWebBrowser user interface (part 3 of 6)IDocHostUIHandlerIDocHostUIHandler2IDocHostShowUI对象为MSHTML(MSHTML不使用IServiceProvider查询它们,因此它们不会触发TWebBrowser.ServiceQuery事件。这些接口是大多数ICustomDoc选项的根,如MSDN上所述:

  

WebBrowser Customization自定义机制旨在在容器提供对ActiveX控件的支持时实现自动化。 只要实例化WebBrowser控件,它就会尝试从主机中查找IDocHostUIHandlerIDocHostUIHandler2IDocHostShowUI实现(如果可用)。 WebBrowser Control通过主持人WebBrowser Control界面上的QueryInterface来执行此操作。

     

此体系结构自动适用于实现IOleClientSite接口的应用程序,并通过浏览器的IOleClientSite方法将IOleClientSite指针传递给WebBrowser Control