WebView 에서 addJavascriptInterface 인터페이스의 위험 해결 방안
4701 단어 Android$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