WebView 에서 addJavascriptInterface 인터페이스의 위험 해결 방안

4701 단어 Android$WebView
우 리 는 웹 뷰 를 사용 하여 웹 페이지 를 보 여 주 려 고 할 때 가 많 습 니 다. 현재 많은 응용 프로그램 들 이 서버 에서 제어 할 수 있 도록 하기 위해 많은 결과 페이지 가 로 컬 이 아 닌 웹 페이지 입 니 다. 이렇게 하면 좋 은 점 이 많 습 니 다. 예 를 들 어 인터페이스의 변 화 는 새로운 버 전 을 다시 발표 하지 않 고 서버 에서 수정 하면 됩 니 다.웹 페이지 로 화면 을 보 여 줍 니 다. 보통 상황 에서 자바 코드 와 상호작용 을 합 니 다. 예 를 들 어 웹 페이지 위의 단 추 를 누 르 면 우 리 는 이 단 추 를 누 르 면 이 벤트 를 클릭 하거나 우리 가 특정한 방법 을 호출 하여 페이지 가 특정한 동작 을 수행 하도록 해 야 합 니 다. 이런 상호작용 을 실현 하기 위해 우 리 는 보통 JS 를 사용 하여 이 루어 집 니 다. 한편, WebView 는 이러한 방법 을 제공 합 니 다.구체 적 인 용법 은 다음 과 같다.
[java]  view plain  copy
mWebView.getSettings().setJavaScriptEnabled(true);  
mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");  
우 리 는 WebView 에 'jsInterface' 라 는 대상 을 등록 한 다음 에 JS 에서 jsInterface 라 는 대상 을 방문 하면 이 대상 의 일부 방법 을 호출 할 수 있 고 최종 적 으로 자바 코드 에 호출 하여 JS 와 자바 코드 의 상호작용 을 실현 할 수 있다.
그러나 addJavascriptInterface 를 사용 하면 악성 코드 가 포 함 될 수 있 기 때문에 안전 하지 않 을 수 있 습 니 다.
만약 우리 자신 이 addJavascriptInterface 를 추가 하지 않 았 다 면, 심지어 기본 값 은 false 일 까요?아직 구멍 이 있어!API 17 이하 의 WebView 에 mJavaScriptObjects 에 기본적으로 "searchBoxJavaBridge" 를 추가 하기 때 문 입 니 다.
        이렇게 하면 사용자 가 신뢰 하 는 클 라 이언 트 를 통 해 SD 카드 의 데 이 터 를 얻 을 수 있다.
        해결 방법 은 몇 가지 가 있다.
        1. 로 컬 파일 에 대한 접근 필터: 
[java]  view plain  copy
if (!url.startsWith("file://")) {  
        // to do.  
}  
        2. 알 수 없 는 사 이 트 를 걸 러 냅 니 다. (본 사이트 가 아 닌 것 은 불 러 올 수 없습니다.)
        3. 기본 추 가 된 "searchBoxJavaBridge" 삭제
[java]  view plain  copy
// in WebView setting:  
        if (Build.VERSION.SDK_INT > 10&&Build.VERSION.SDK_INT 17) {  
            fixWebView();  
        }  
  
// fixWebView like this:  
    @TargetApi(11)  
    private void fixWebView() {  
            //        http://50.56.33.56/blog/?p=314  
            //        http://drops.wooyun.org/papers/548  
            // We hadn't use addJavascriptInterface, but WebView add "searchBoxJavaBridge_" to mJavaScriptObjects below API 17 by default:  
            // mJavaScriptObjects.put(SearchBoxImpl.JS_INTERFACE_NAME, mSearchBox);  
            mWebView.removeJavascriptInterface("searchBoxJavaBridge_");  
    }  
    4.
(prompt()$onJsPrompt()/confirm()$onConfirm()/alert()$onAlert()):
이 웹 크롬 클 라 이언 트 를 계승 하여 세 개 이상 다시 쓰기
방법 중 하나 의 구체 적 인 실현
class HarlanWebChromeClient extends WebChromeClient {

        /*      javascript  alert  。
         *       alert   ,   onJsAlert    
         *      alert       。
         */
        @Override
        public boolean onJsAlert(WebView view, String url, String message,
                                 JsResult result) {
            show("onJsAlert");
            result.confirm();
            return true;
        }

        /*      javascript  confirm  。
         *       confirm   ,   onJsConfirm    
         *      confirm       。
         */
        @Override
        public boolean onJsConfirm(WebView view, String url,
                                   String message, JsResult result) {
            show("onJsConfirm");
            result.confirm();
            return true;
        }

        /*      javascript  confirm  。
         *       confirm   ,   onJsConfirm    
         *      confirm       。
         */
        @Override
        public boolean onJsPrompt(WebView view, String url,
                                  String message, String defaultValue,
                                  JsPromptResult result) {
            show("onJsPrompt....");
            result.confirm();
            return true;
        }

그리고 웹 뷰 에 재 작성 할 클래스 를 설정 합 니 다.
//  ChromeClient
mWebView.setWebChromeClient(new HarlanWebChromeClient());

해당 JS 의 구체 적 인 실현 코드 는 다음 과 같다.
function cfm() {
            confirm("")
        }

        function pmt() {
           prompt("","");
        }

        function onAlert()
        {
            alert("      alert  ,     mWebView onAlert  ,       ");
        }

페이지 의 js 함 수 를 터치 합 니 다. 예 를 들 어:


실현 원 리 는 페이지 에서 촉발 하 는 방법 이 웹 뷰 에 설 치 된 웹 크롬 클 라 이언 트 에 의 해 차단 되 어 웹 크롬 클 라 이언 트 에서 다시 쓰 는 onXxx () 방법 을 실 행 했 고 페이지 에 해당 하 는 onXxx () 방법 을 실행 하지 않 았 다 는 것 이다. 이것 은 방식 이 상대 적 으로 간단 하고 안전 하 다.
참조 링크: https://github.com/Sunzxyong/RainbowBridge
   http://blog.csdn.net/owillll/article/details/20996139

좋은 웹페이지 즐겨찾기