TWebBrowser: отключить все ограничения безопасности
Я использую компонент TWebBrowser в Delphi 10.2, который импортируется из библиотеки типов SHDocVW_TLB.
Я хочу использовать этот веб-браузер для просмотра локальных файлов и файлов в доверенной среде. Но я заметил, что вызов AJAX из локального файла (точнее: пользовательский контент HTML, который я загрузил в компонент браузера с использованием этого кода) в LAN или WAN невозможен из-за ограничений безопасности.
Моя цель - отключить все ограничения безопасности (я знаю о рисках) для этого элемента управления веб-браузера.
Не уверен, есть ли другие способы, но я думаю, что я должен создать собственный IInternetSecurityManager. Во время моего исследования я нашел этот документ Microsoft, и он объясняет, как написать такой SecurityManager. Но нигде я не могу найти, как "вставить / перезаписать" этот пользовательский IInternetSecurityManager в мой элемент управления TWebBrowser.
Что мне нужно сделать, чтобы полностью отключить все ограничения безопасности? Спасибо за любую подсказку!
1 ответ
Ответ содержится в той же документации MSHTML, на которую вы ссылались в своем вопросе:
Приложения, размещающие элемент управления WebBrowser или MSHTML
Узлы управления WebBrowser или MSHTML могут создать менеджер безопасности (путем реализации
IInternetSecurityManager
интерфейс), который обрабатывает действия и политики URL, которые важны для хоста. Другие действия и политики URL-адреса будут переданы диспетчеру безопасности по умолчанию, чтобы он мог обрабатывать их соответствующим образом.IInternetSecurityMgrSite
Интерфейс будет использоваться для обработки связанной с Windows информации из компонента, чтобы настраиваемый менеджер безопасности мог обрабатывать любой требуемый пользовательский интерфейс.Чтобы создать настраиваемый менеджер безопасности, компонент должен реализовать
IInternetSecurityManager
интерфейс Любые методы или действия URL, для которых настроенному менеджеру безопасности нужен менеджер безопасности по умолчанию, должен возвращатьсяINET_E_DEFAULT_ACTION
,Предупреждение о безопасности: внедрение
IInternetSecurityManager
неправильные методы могут поставить под угрозу безопасность вашего приложения. Любые методы или действия URL, для которых настроенному менеджеру безопасности нужен менеджер безопасности по умолчанию, должен возвращатьсяINET_E_DEFAULT_ACTION
, Если метод не переопределяет поведение по умолчанию и возвращает HRESULT, указывающий на успех, действие не обрабатывается и может подвергнуть пользователей риску атаки с повышением привилегий. Перед продолжением ознакомьтесь с разделом "Вопросы безопасности: API зон безопасности URL".Компонент должен также реализовать объект, который поддерживает
IOleClientSite
интерфейс при встраивании элемента управления WebBrowser или MSHTML.Следующие шаги выполняются для действия URL.
MSHTML использует
CoCreateInstance
создать экземпляр Internet Security Manager.Internet Security Manager вызывает
QueryInterface
метод на MSHTML, чтобы получить егоIServiceProvider
интерфейс. MSHTML затем вызываетQueryInterface
метод наIOleClientSite
интерфейс, чтобы получитьIServiceProvider
интерфейс
IServiceProvider::QueryService
призван получитьIInternetSecurityManager
интерфейс Затем компонент передает указатель на свою реализациюIInternetSecurityManager
в диспетчер интернет-безопасности.Звонки из MSHTML на
IInternetSecurityManager
методы передаются в пользовательский менеджер безопасности из Internet Security Manager по умолчанию.Если вызванный метод возвращает
INET_E_DEFAULT_ACTION
реализация по умолчаниюIInternetSecurityManager
используется для разрешения звонка. В противном случае возвращается результат из настраиваемого менеджера безопасности.Internet Security Manager возвращает результат обратно в MSHTML.
Итак, сначала вам нужно написать класс, который реализует IInternetSecurityManager
интерфейс.
Во-вторых, к счастью TOleControl
(который TWebBrowser
вытекает из) осуществила IOleClientSite
а также IServiceProvider
интерфейсы начиная с Delphi 2006, так что все, что вам нужно сделать, это назначить обработчик для его общедоступного ServiceQuery
событие, и когда MSHTML вызывает IServiceProvider.QueryService()
находясь в поиске IInternetSecurityManager
, вы можете вернуть экземпляр вашего собственного класса менеджера безопасности.
Для более старых версий Delphi вы можете указать IOleClientSite
Возражать TWebBrowser
по запросу его DefaultInterface
собственность для IOleObject
интерфейс, а затем вызвать IOleObject.SetClientSite()
метод. Пример этого демонстрируется в следующей статье:
Как настроить пользовательский интерфейс TWebBrowser (часть 3 из 6)
обеспечение TWebBrowser
с обычаем IOleClientSite
как вы можете предоставить свой собственный IDocHostUIHandler
, IDocHostUIHandler2
, IDocHostShowUI
, а также ICustomDoc
объекты в MSHTML (MSHTML не запрашивает их, используя IServiceProvider
, поэтому они не будут вызывать TWebBrowser.ServiceQuery
событие). Эти интерфейсы являются корнем большинства параметров настройки WebBrowser, как описано в MSDN:
Механизм настройки элемента управления WebBrowser предназначен для автоматизации, когда контейнер обеспечивает поддержку элементов управления ActiveX. Всякий раз, когда создается экземпляр элемента управления WebBrowser, он пытается найти
IDocHostUIHandler
,IDocHostUIHandler2
а такжеIDocHostShowUI
реализации от хоста, если они доступны. Элемент управления WebBrowser делает этоQueryInterface
позвонить на хостеIOleClientSite
интерфейсЭта архитектура работает автоматически для приложения, которое реализует
IOleClientSite
интерфейс и проходитIOleClientSite
указатель на элемент управления WebBrowser через браузерIOleObject::SetClientSite
метод.