2017-06-20 125 views
1

我在Delphi 10.2中使用TWebBrowser組件,該組件從SHDocVW_TLB類型庫中導入。TWebBrowser:禁用所有安全限制

我想使用這個網絡瀏覽器來瀏覽可信環境中的本地文件和文件。但我注意到由於安全限制因素,本地文件(更確切地說,我已將使用this code加載到瀏覽器組件中的自定義HTML內容)發送到局域網或廣域網的AJAX調用是不可能的。

我的目標是禁用此Web瀏覽器控件的所有安全限制(我意識到這些風險)。

不知道是否有其他方式,但我想我必須創建一個自定義IInternetSecurityManager。在我的研究中,我發現了this document by Microsoft,並解釋瞭如何編寫這樣的SecurityManager。 但是無處可去我可以找到如何將這個自定義IInternetSecurityManager插入/覆蓋到我的TWebBrowser控件中。

我需要做什麼才能完全禁用所有安全限制? 謝謝你的提示!

+0

查看[EmbeddedWB的安全管理器](https://github.com/ghquant/Delphi-EmbeddedWB/blob/master/Source/SecurityManager.pas)以及瀏覽器控件如何使用它。 – Victoria

+0

@Victoria文件SecurityManager.pas包含類實現'TSecurityManager = class(TComponent,IInternetSecurityManager)',但是在代碼中我找不到任何TSecurityManager對象的實際使用,除了Source/EwbReg.pas,它只註冊零件。所以我仍然不知道如何告訴TWebBrowser使用自定義的安全管理器實現。 –

+0

您需要處理OnQueryService,並在詢問有關IInternetSecurityManager服務時,創建並將其返回給調用者。 –

回答

6

答案是,你在你的問題鏈接到同一個MSHTML documentation

應用程序承載WebBrowser控件或MSHTML

WebBrowser Control或MSHTML主機可以創建一個安全管理器(由執行IInternetSecurityManager接口),它處理對主機很重要的URL操作和策略。其他URL操作和策略將傳遞給默認安全管理器,以便它可以適當地處理它們。接口將用於處理組件中與Windows相關的信息,以便定製安全管理器可以處理它需要的任何用戶界面。

要創建自定義安全管理器,組件必須實現IInternetSecurityManager接口。自定義安全管理員需要默認安​​全管理員執行操作的任何方法或URL操作應返回INET_E_DEFAULT_ACTION

安全警告:錯誤地實施IInternetSecurityManager方法可能會危及應用程序的安全。自定義安全管理員需要默認安​​全管理員執行操作的任何方法或URL操作應返回INET_E_DEFAULT_ACTION。如果某個方法不覆蓋默認行爲並返回HRESULT指示成功,則該操作未處理並且可能使用戶面臨特權提升攻擊的風險。在繼續之前,您應該檢查Security Considerations: URL Security Zones API

當嵌入WebBrowser Control或MSHTML時,組件還必須實現支持IOleClientSite接口的對象。

對於URL操作,會發生以下步驟。

  1. MSHTML使用CoCreateInstance創建Internet Security Manager的一個實例。

  2. Internet Security Manager在MSHTML上調用QueryInterface方法來獲取其接口IServiceProviderMSHTML然後調用IOleClientSite接口上的QueryInterface方法來獲取IServiceProvider接口

  3. IServiceProvider::QueryService被調用來獲得IInternetSecurityManager接口。然後該組件將指向其實現IInternetSecurityManager的指針傳遞給Internet Security Manager

  4. 從MSHTML到IInternetSecurityManager方法的呼叫從默認Internet Security Manager傳遞到自定義安全管理器。

  5. 如果調用方法返回INET_E_DEFAULT_ACTION,則使用IInternetSecurityManager的默認實現來解決呼叫。否則,將返回自定義安全管理器的結果。

  6. Internet Security Manager將結果返回給MSHTML。

所以,首先你需要編寫一個實現IInternetSecurityManager接口的類。

其次,幸好TOleControl(其中TWebBrowser派生自)自至少德爾福2006年實施的IOleClientSiteIServiceProvider接口,因此,所有你需要做的是處理函數分配給它的公共ServiceQuery事件,當MSHTML調用IServiceProvider.QueryService()尋找IInternetSecurityManager,您可以返回自定義安全管理器類的實例。

對於老版本的Delphi,您可以手動查詢爲IOleObject接口提供IOleClientSite對象TWebBrowserDefaultInterface屬性,然後調用IOleObject.SetClientSite()方法。這方面的一個例子是體現在下面的文章:

How to customise the TWebBrowser user interface (part 3 of 6)

提供TWebBrowser用自定義IOleClientSite是怎麼您也可以提供自己的自定義IDocHostUIHandlerIDocHostUIHandler2IDocHostShowUIICustomDoc對象MSHTML(MSHTML不使用IServiceProvider查詢它們,因此它們不會觸發TWebBrowser.ServiceQuery事件)。這些接口是大多數WebBrowser Customization選項根,如在MSDN描述:

WebBrowser Control定製的機制被設計爲當一個容器提供對ActiveX控件支持自動化。 無論何時WebBrowser控件被實例化,它都會嘗試從主機中找到IDocHostUIHandler,IDocHostUIHandler2IDocHostShowUI實現(如果它們可用)。 WebBrowser控件通過主機的IOleClientSite接口上的QueryInterface調用執行此操作。

該體系結構自動適用於實現接口IOleClientSite並通過瀏覽器的IOleObject::SetClientSite方法將IOleClientSite指針傳遞到WebBrowser Control的應用程序。

+0

你好,非常感謝你的幫助。我設法替換了IInternetSecurityManager(https://pastebin.com/288rRLi6),現在我可以將所有頁面設置到同一個區域。我還允許使用「允許」的所有ProcessUrlAction和QueryCustomPolicy請求。但是,它不能按預期工作。我預計所有的安全限制都會消失。但似乎並非如此。跨域請求不起作用(file:// to https://),並且從「file://」頁面到「file://」頁面的AJAX查詢也不起作用。 :-(是否有什麼我錯過了或者我能做些什麼來降低安全性更多? –

+0

也許這是因爲你迫使所有URL只在「Internet」區域中。對於本地內容而言,這當然不是一個好主意這應該可能在「本地」或「受信任」區域。請參閱[安全注意事項:URL安全區域API](https://msdn.microsoft.com/en-us/library/ms537019(v = vs.85 ).aspx) –

+0

我試過了所有區域,但它不起作用,只要我嘗試通過AJAX/JavaScript調用本地文件,就會出現「Access denied」錯誤。場景,跨域查詢,問題是限制「請求必須針對與託管頁面相同的方案」,但我希望安全管理器也可以覆蓋該規則,但是對於我的AJAX場景,文件://調用file://,所以我不明白爲什麼沒有訪問權限。 –