我正在使用Delphi 10.2中的TWebBrowser组件,该组件是从SHDocVW_TLB类型库导入的。
我想使用此Web浏览器浏览受信任环境中的本地文件和文件。但我注意到,由于安全限制,无法通过本地文件(更确切地说:我使用this code将自定义HTML内容加载到浏览器组件中)到LAN或WAN进行AJAX调用。
我的目标是禁用此Web浏览器控件的所有安全限制(我知道存在风险)。
不确定是否还有其他方法,但我认为我必须创建一个自定义的IInternetSecurityManager。在我的研究过程中,我找到了this document by Microsoft,并解释了如何编写这样的SecurityManager。 但我无处可寻找"插入/覆盖"这个自定义的IInternetSecurityManager进入我的TWebBrowser控件。
要完全禁用所有安全限制,我需要做什么? 谢谢你的提示!
答案 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操作,会发生以下步骤。
MSHTML使用
CoCreateInstance
创建Internet Security Manager的实例。Internet Security Manager调用MSHTML上的
QueryInterface
方法获取其IServiceProvider
接口。 MSHTML然后调用IOleClientSite
界面上的QueryInterface
方法获取IServiceProvider
界面。
IServiceProvider::QueryService
被调用以获得IInternetSecurityManager
界面。然后,组件将指向其IInternetSecurityManager
的实现的指针传递给Internet Security Manager。从MSHTML到
IInternetSecurityManager
方法的调用将从默认的Internet Security Manager传递到自定义安全管理器。如果调用的方法返回
INET_E_DEFAULT_ACTION
,则使用IInternetSecurityManager
的默认实现来解析调用。否则,将返回自定义安全管理器的结果。- 醇>
Internet Security Manager会将结果返回给MSHTML。
所以,首先你需要编写一个实现IInternetSecurityManager
接口的类。
第二,幸运的是TOleControl
(TWebBrowser
派生的)至少从Delphi 2006开始实现IOleClientSite
和IServiceProvider
接口,所以你需要做的就是分配公共ServiceQuery
事件的处理程序,当MSHTML调用IServiceProvider.QueryService()
查找IInternetSecurityManager
时,您可以返回自定义安全管理器类的实例。
对于较旧的Delphi版本,您可以通过查询IOleObject
接口的IOleClientSite
属性手动向TWebBrowser
提供DefaultInterface
对象,然后调用{{3 }} 方法。下面这篇文章就是一个例子:
为TWebBrowser
提供自定义IOleClientSite
,您还可以提供自己的自定义How to customise the TWebBrowser user interface (part 3 of 6),IDocHostUIHandler
,IDocHostUIHandler2
和IDocHostShowUI
对象为MSHTML(MSHTML不使用IServiceProvider
查询它们,因此它们不会触发TWebBrowser.ServiceQuery
事件。这些接口是大多数ICustomDoc
选项的根,如MSDN上所述:
WebBrowser Customization自定义机制旨在在容器提供对ActiveX控件的支持时实现自动化。 只要实例化WebBrowser控件,它就会尝试从主机中查找
IDocHostUIHandler
,IDocHostUIHandler2
和IDocHostShowUI
实现(如果可用)。 WebBrowser Control通过主持人WebBrowser Control界面上的QueryInterface
来执行此操作。此体系结构自动适用于实现
IOleClientSite
接口的应用程序,并通过浏览器的IOleClientSite
方法将IOleClientSite
指针传递给WebBrowser Control。