限制cefsharp js绑定对象到白名单域

问题描述

我有一个 CEFSharp 浏览器实现,其中使用 JavascriptObjectRepository 绑定到 CEF 浏览器的 C# 对象很少。问题是当用户尝试跨页面导航时,他最终可能会进入可以利用此公开对象的意外页面。我需要将这些对象限制在特定域中。有没有正确的方法来实现这一目标?

注意:我已经看到可以在绑定选项中添加 MethodInterceptor,但它没有将 url 作为参数给出。

解决方法

在这个问题上停留了一段时间,但找到了答案。我必须实现 MethodInterceptor 来跟踪跨站点的对象使用情况。由于方法拦截器没有 URL 参数,我必须显式订阅以解决 ChromiumWebBrowser 实例中的更改事件。

  1. 绑定 -

    BindingOptions bindingOptions = new BindingOptions();
    bindingOptions.MethodInterceptor = new CefJSObjectInterceptor(browser);    
    browser.JavascriptObjectRepository.Register(jsName,jsObj,true,bindingOptions); // Note: skipped LegacyJavascriptBindingEnabled check
    
  2. 方法拦截器实现 -

     internal class CefJSObjectInterceptor : IMethodInterceptor
     {
         string currentAddress;
         public CefJSObjectInterceptor(ChromiumWebBrowser browser)
         {
             browser.AddressChanged += Browser_AddressChanged;
         }
    
         private void Browser_AddressChanged(object sender,System.Windows.DependencyPropertyChangedEventArgs e)
         {
             currentAddress = e.NewValue.ToString();
         }
    
         public object Intercept(Func<object[],object> method,object[] parameters,string methodName)
         {
             Uri uri = new Uri(currentAddress);
             string url = uri.Host.ToString();
             if (isAcceptableURL(url))
             {
                 object result = method(parameters);
                 return result;
             }
             return null;
         }
    
         bool isAcceptableURL(string url)
         {
             HashSet<string> validURLs = new HashSet<string> { "google.com","microsoft.com","127.0.0.1" };
             foreach (var validURL in validURLs)
             {
                 if (url.EndsWith(validURL))
                 {
                     return true;
                 }
             }
             return false;
         }
     }
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...