Implementing a Custom Security Manager(翻译)
原文:http://msdn.microsoft.com/en-us/library/ms537182(v=vs.85).aspx
实现自定义安全管理器
应用程序可以使用IInternetZoneManager接口来管理默认的URL安全区域设置。然而,用IInternetZoneManager作的任何改变都不是静态的,因为用户可以覆盖这些设置。(应该是用户可以用IE的设置来覆盖IInternetZoneManager改变的设置吧。)要控制应用程序的URL安全区域,应该内嵌(宿主)WebBrowser Control or MSHTML控件,并且应该实现他们自己的安全管理器。
这个文档假象你已经理解了Win32程序的开发。当然你也应该理解OLE和COM程序的开发,当然你也应该理解URL的语法格式,关于URL的语法格式请参考:RFC1738: Uniform Resource Locators (URL).
这篇文章包含下面的章节:
- 处理URL安全区域
- 与RUL安全区域相关的接口
- 应用程序内嵌(宿主)WebBrowser Control 或 MSHTML
- MSHTML内嵌(宿主)组件
- 创建一个自定义的URL安全管理器
- 访问默认的管理器
- 相关主题
处理URL安全区域
你要使用URL安全区域接口有两种情况:
- 应用程序应该 内嵌(宿主)WebBrowser Control 或 MSHTML 并且实现他们自己的安全管理器去处理安全区域。
- MSHTML去内嵌(宿主)控件,将会获得关于安全设置的信息。
与URL安全区域相关的接口:
为了访问新的安全区域封锁,IE6和 XP SP2有2中扩展的接口和一个新的接口.
- IInternetSecurityManagerEx --这个接口扩展了IInternetSecurityManagerEx,因此IE可以从封锁的安全区域获取URL策略,以及从正常的安全区域获取URL策略。
- IInternetSecurityManagerEx::ProcessUrlActionEx 方法确定一个详细的URL action,如果一个策略调用它将会显示一个提示。如果当前的处理过程的FEATURE_PROTOCOL_LOCKDOWN 是可用的,并且 URLACTION_ALLOW_RESTRICTEDPROTOCOLS 的值在URL安全区域为URLPOLICY_DISALLOW or URLPOLICY_QUERY,调用者将会指明可以从封锁的区域度URL的值,用pdwOutFlags 参数。ProcessUrlActionEx会通过dwFlags参数通知调用方的的选择区域。
- IInternetZoneManagerEx -- 扩展了IInternetZoneManager 接口,因此IE可以获取一个指明URL action向关联的策略或者设置一个区域相关联的action 策略。这个扩展的接口可以在封锁的安全区域和正常的安全区域执行actions。
- IZoneIdentifier—这个新接口提供的方法用于获取和设置文件的安全区。
应用程序内嵌(宿主)WebBrowser Control 或 MSHTMLS
WebBrowser Control 或 MSHTML 宿主程序可以创建一个安全管理器(通过实现 IInternetSecurityManager 接口)去处理URL action 和策略,这对宿主程序是很重要的。其他URL的action和策略将是通过默认的安全管理器,使其能适当地处理它们。IInternetSecurityMgrSite接口将用于处理Windows相关组件相关的信息,以便自定义安全管理器可以处理它所需的任何用户界面。
为了创建一个自定义的安全管理器,组件必须实现 IInternetSecurityManager接口。自定义安全管理器的任何方法或URL action需要默认的安全管理器起作用应改返回INET_E_DEFAULT_ACTION
安全警告:不正确地实现IInternetSecurityManager接口可能会造成你的应用程序不安全。我们自定义的安全管理器的任何方法 或 URL的action需要默认安全管理器是就要返回INET_E_DEFAULT_ACTION.如果方法没有重载默认行为并且返回一个HRESULT 表明成功,这样将不受控制,并且也给用户带来特权提升的攻击。你应该回顾一下Security Considerations: URL Security Zones API再继续。
组件当嵌入到WebBrowser Control 或 MSHTML控件时,必须实现一个支持 IOleClientSite接口的对象。
下面是URL action的步骤.
-
MSTHML 用 CoCreateInstance 方法创建一个Internet Security Manager的一个实例.
-
Internet Security Manager接口调用MSTHML上的QueryInterface 方法得到它的 IServiceProvider接口。MSHTML这时调用IOleClientSite 接口上的QueryInterface 方法去得到IServiceProvider 接口。
-
IServiceProvider::QueryService 在得到一个 IInternetSecurityManager方法的时候被调用。组件这时将一个实现了IInternetSecurityManager指针传给Internet Security Manager。
-
从MSHTML到 IInternetSecurityManager方法的调用,是传一个默认的安全管理器到自定义安全管理器。
-
如果被调用的方法返回值为INET_E_DEFAULT_ACTION,IInternetSecurityManager的默认实现将被用于调用。否则,结果来自自定义安全管理器将会被返回.
-
Internet Security Manager返回结果到MSHTML.
注意:该URL安全区域的API提供了仅支持单个自定义安全管理器委托URL action返回到默认的安全管理器。如果多个实现自定义安全管理器,附加安全性管理者必须显式将它们找到并调用上面的安全管理器允许多个委托的正常运行。
MSHTML 承载(嵌入、宿主)组件
WebBrowser 或 MSHTML嵌入(宿主) 的组件,可能需要在他们的URL安全区域上查询被实现的URL策略。这些组件包括像JScript和VBScript脚本引擎,控件,java applets,等等。例如组件在IE里面的下载机制必须问安全管理器它是否可以下载没有签名的ActiveX控件。组件调用IInternetHostSecurityManager::ProcessUrlAction 方法去检查在Java applets上的是什么策略去帮助决定它的回答(是否可以下载)
安全警告:不正确地使用这个方法会危及到你的应用的安全。知道返回一个指明为S_FALSE或错误,你的组件应该想象在当前策略下URL action是不允许的。如果你的组件执行一个action后接受到一个错误,用户可能遭受提升特权攻击的威胁。你应该回顾 Security Considerations: URL Security Zones API 后再继续。
为了查询URL 策略,这些组件要使用 IInternetHostSecurityManager接口,组件必须有由WebBrowser control 或MSHTML控件实现的站点地址接口。具体的站点接口应该依赖承载(嵌入、宿主)组件的类型。一个脚本引擎应该实现IActiveScriptSite 接口,也应该实现IOleClientSite 接口。为了得到这个接口的地址:
-
组件在站点接口上调用QueryInterface方法,得到 IServiceProvider接口,组件这时可以调用IServiceProvider::QueryService方法得到IInternetHostSecurityManager 接口。
-
组件调用IInternetHostSecurityManager 方法,宿主安全管理器创建一个Internet Security Manager实例,宿主安全管理器这时附件URL并且调用IInternetSecurityManager 接口上的关联方法。
如果一个自定义安全管理器有宿主的应用程序实现的,默认的Internet Security Manager 将传递调用到自定义的安全管理器的IInternetSecurityManager 接口.
-
IInternetSecurityManager 方法会返回它的结果到IInternetHostSecurityManager,然后将结果传递给组件.
创建一个自定义的URL安全管理器
一个自定义的URL安全管理器可以有应用程序创建。应用程序可以通过实现承载他们的WebBrowsr Control 或 MSHTML实现IInternetSecurityManager接口。许多IInternetSecurityManager方法,需要返回INET_E_DEFAULT_ACTION,除了 IInternetSecurityManager::ProcessUrlAction方法,让默认的安全管理器调用。
安全警告:不正确地实现IInternetSecurityManager接口可能会造成你的应用程序不安全。我们自定义的安全管理器的任何方法 或 URL的action需要默认安全管理器是就要返回INET_E_DEFAULT_ACTION.如果方法没有重载默认行为并且返回一个HRESULT 表明成功,这样将不受控制,并且也给用户带来特权提升的攻击。你应该回顾一下Security Considerations: URL Security Zones API再继续。
下面是一个实现了IInternetSecurityManager::ProcessUrlAction,数据需要加密的示例,
HRESULT MySecurityManager::ProcessUrlAction(LPWSTR pwszUrl, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, DWORD dwReserved) { DWORD dwPolicy = URLPOLICY_ENCRYPT_REQUIRED; if (dwAction == URLACTION_ENCRYPT_DATA) {{ if (cbPolicy >= size (DWORD)) { *(DWORD *)pPOLICY = dwPOLICY; return S_OK; } else return S_FALSE; } else return INET_E_DEFAULT_ACTION; }
提示:默认的安全管理器不能由自定义的安全管理器代替。
访问默认的安全管理器
访问默认的Internet安全管理器和Internet区域管理器对象,客户端应用程序应使用CoCreateInstance函数来创建这些对象的实例。
下面的例子是创建一个Internet Security Manager和Internet Zone Manager的实例:
HRESULT hr; IInternetSecurityManager *pSecurityMgr; IInternetZoneManager *pZoneMgr; hr = CoCreateInstance(CLSID_InternetSecurityManager, NULL, CLSCTX_INPROC_SERVER, IID_IInternetSecurityManager, (void**)&pSecurityMgr); hr = CoCreateInstance(CLSID_InternetZoneManager, NULL, CLSCTX_INPROC_SERVER, IID_IInternetZoneManager, (void**)&pZoneMgr);