2015-05-19 3 views
4

Мы хотим использовать Android WebView в качестве песочницы для выполнения локальных приложений HTML/JS. Основным требованием к безопасности является установка автономного режима WebView и разрешение только определенных интерфейсов javascript. Эти интерфейсы передаются во время выполнения javascript, используя метод WebView.addJavascriptInterface().Force Android WebView offline

Приложение Android имеет право доступа к сети (android.permission.INTERNET).

Я могу отключить обычные запросы http/https, , но полностью не удалось заблокировать запросы WebSocket. Кажется, что они обрабатываются разными обычными HTTP-запросами.

Один из вариантов заключается в том, чтобы перезаписать метод JavaScript WebSocket. Но это дает мне плохое чувство, поскольку это против концепции песочницы. Также представляется возможным использовать delete для восстановления исходного указателя функции.

Другой альтернативой было бы расслоение собственного настраиваемого WebView (например, Crosswalk-Project) с нашим приложением, но хотелось бы избежать этого, поскольку компиляция и обновления - это довольно много усилий.

Я попытался следующие интерфейсы общественных WebView, но ни один из них не кажется блокировать WebSocket вызовы:

  • webSettings.setBlockNetworkLoads (истина);
  • webSettings.setCacheMode (WebSettings.LOAD_CACHE_ONLY);
  • webView.setNetworkAvailable (false);
  • WebViewClient.shouldOverrideUrlLoading() (обратный вызов)
  • WebViewClient.shouldInterceptRequest() (обратный вызов, пробовал обе версии)
  • WebChromeClient.onPermissionRequest()

Проверено на Android 4.4.4 (19) и Android 5/5.1 (21/22).

Javascript Я выполнения:

ws = new WebSocket("wss://echo.websocket.org"); 

ws.onmessage = function(event) { 
    console.log("received: " + event.data); 
}; 

ws.onclose = function() { 
    console.log("External Socket closed"); 
}; 

ws.onopen = function() { 
    console.log("Connected to external ws"); 
    ws.send("Hello from " + navigator.userAgent); 
}; 

Любые идеи, как это можно сделать?

Большое спасибо

+0

Возможно, не ваш желаемый «запрос», но вы можете установить свою реализацию WebViewClient http://developer.android.com/reference/android/webkit/WebViewClient.html и заставить его быть в автономном режиме – eduyayo

+0

@eduyayo Спасибо, но уже попробовал это (см. вопрос). Обратные вызовы WebViewClient вызываются только для «обычных» HTTP-запросов. Для WebSockets обратные вызовы не работают. –

+0

для веб-сайтов ... есть только один запрос. Вы должны подключить поток – eduyayo

ответ

0

К сожалению, в настоящее время нет способа перехвата WebSockets вызовов в WebView. Вы можете заблокировать только выполнение JavaScript или доступ к сети. Вы правы, что при попытке переопределить конструктор WebSocket с помощью собственной реализации можно легко обойтись, удалив свойство переопределенного окна, поэтому встроенный конструктор, доступный из цепочки прототипов window, снова становится видимым. То же самое произойдет, если вы попытаетесь переопределить WebSocket с помощью WebView.addJavascriptInterface.

Я думаю, что кэш приложений также не перехватывается обратными вызовами WebView, и для работы он даже не требует включения Javascript.

Я полагаю, ваш единственный шанс создать сетевую песочницу WebView с системой WebView - это использовать специальное приложение без сетевого доступа и связаться с ним с помощью Binder IPC.

Сводка настраиваемого WebView создаст еще больше трудностей, так как вам нужно будет выяснить и подключить все отверстия, а затем самостоятельно обновить исправления безопасности.