Из документации: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29
"Использование addJavascriptInterface () позволяет JavaScript управлять вашим приложением. Это может быть очень полезной функцией или опасной проблемой безопасности. Когда HTML в WebView не заслуживает доверия (например, часть или весь HTML предоставлен каким-либо человеком или процессом ), то злоумышленник может внедрить HTML, который выполнит ваш код и, возможно, любой код по выбору злоумышленника. Не используйте addJavascriptInterface (), если весь HTML в этом WebView не был написан вами . Связанный объект Java выполняется в другом потоке, а не в потоке, в котором он был создан.
Предположим, у меня есть интерфейс, который показывает только настраиваемое диалоговое окно или запускает загрузку на SD-карту. Было бы небезопасно использовать это для любого URL-адреса? Как может страница атаки использовать интерфейс для запуска любого кода по выбору злоумышленника?
Обновление: согласно документация:
Этот метод можно использовать, чтобы разрешить JavaScript управлять ведущим приложением. Это мощная функция, но она также представляет угрозу безопасности для приложений, нацеленных на уровень API JELLY_BEAN или ниже, поскольку JavaScript может использовать отражение для доступа к общедоступным полям внедренного объекта. Использование этого метода в WebView, содержащем ненадежный контент, может позволить злоумышленнику манипулировать хост-приложением непреднамеренными способами, выполняя код Java с разрешениями хост-приложения. Будьте предельно осторожны при использовании этого метода в WebView, который может содержать ненадежный контент.
Есть пример того, как это могло произойти? Это просто означает, что DOWNLOADINTERFACE.dangerousfunction
можно было бы вызвать, если бы это был общедоступный метод в этом классе?
Обновлять:
Я тестировал на примере эксплойта ниже, сайты могут получать доступ к системе через интерфейсы в Android 4.4, 4.1 и 3.2.
Однако я не заметил эту ошибку на Android 2.2 или 2.3, взлом вызывает только принудительное закрытие. Как лучше всего предотвратить этот взлом, кроме отказа от JSInterface? Могу ли я включать такие поддельные функции, чтобы предотвратить несанкционированный вызов функций?
public Object getClass() {
//throw error, return self, or something?
}
Или все переписать с помощью ajax и перехвата звонков? Приведет ли это к лучшей / худшей производительности?
Обновление:
Мне удалось удалить интерфейс JS и заменить его функциональность, определив команды window.open (specialurl) для всех функций window. (Interface) и переопределив их в shouldOverrideUrlLoading. Как ни странно, в некоторых случаях необходимо использовать window.open (), или веб-просмотр прерывает отображение (например, останавливается javascript?), А в других случаях следует использовать location.replace, иначе он просто покажет "interface: // specialdata" "не удалось найти сообщение.
(Я установил settings.setJavaScriptCanOpenWindowsAutomatically (true), поэтому window.open все время работает с JS.)
Кто-нибудь знает, как лучше всего переписать приложение с таким поведением?
JavascriptInterface
? Кроме того, я заметил, что ваш способ переопределения getClass () невозможен, поскольку getClass () является последним методом. - person Chan   schedule 08.01.2014