2017-05-12 6 views
0

this質問に記載されているようなテクニックを実装しようとしています。Android WebViewでXフレームオプションDENYを回避する

私はwebviewで動作するアンドロイドアプリケーション(Cordovaの上に構築されたイオニック)を持っています。基本的には、iframeにページを読み込んで、このページでいくつかの作業を行います。多くのウェブサイトでは、X-Frame-Options: DENYヘッダーを使用してコンテンツのiFrameへの読み込みを禁止しています。クローム拡張機能では、Webリクエストをインターセプトしてそのヘッダーを削除することで、この問題を回避できます。

私はここに shouldInterceptRequest機能をオーバーライドしてきました

https://developer.android.com/reference/android/webkit/WebViewClient.html

// Handle API until level 21 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
    try { 
     WebResourceResponse cordovaResponse = super.shouldInterceptRequest(view, request); 
     if(cordovaResponse != null) { 
     return cordovaResponse; 
     } 
     String url = request.getUrl().toString(); 
     HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); 
     urlConnection.connect(); 
     //view.loadUrl(url, getCustomHeaders()); 
     WebResourceResponse response = new WebResourceResponse(urlConnection.getContentType(), 
     urlConnection.getContentEncoding(), 
     urlConnection.getInputStream()); 
     Map<String, String> headers = response.getResponseHeaders(); 
     if(headers != null){ 
     response.setResponseHeaders(removeXOriginHeaders(headers)); 
     } 
     return response; 

    } catch(MalformedURLException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    }` 

が、すべてのリクエストのヘッダーには、上記の方法を使用して受信されたとき、彼らはヌルであり、コンテンツはIFRAMEに置かれたとき、それはdoesnの完全に形成されたドキュメントになります。

クロムデバッガはこのメッセージを提供します。Resource interpreted as Document but transferred with MIME type text/html;charset=UTF-8:

それは、ページのコンテンツは、XHRを使用してフェッチさのようなものだし、その後ロードとは対照的に、それは通常(すべてのスクリプトをインラインフレームを使用する場合と同様にドキュメントの単一要素内に立ち往生その後実行されるajax要求など)。

1つのヘッダーを削除した後でiframeにページコンテンツを読み込むための方法はありますか?

答えて

0

私はOkHttpClientを使って、私の問題を解決することができましたがここで見つける:Javaのかわりにhttp://square.github.io/okhttp/URLConnection

// Handle API until level 21 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
     public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
     try { 
      WebResourceResponse cordovaResponse = super.shouldInterceptRequest(view, request); 
      if(cordovaResponse != null) { 
      return cordovaResponse; 
      } 
      String url = request.getUrl().toString(); 
      OkHttpClient httpClient = new OkHttpClient(); 
      Request okRequest = new Request.Builder() 
      .url(url) 
      .build(); 
      Response response = httpClient.newCall(okRequest).execute(); 
      Response modifiedResponse = response.newBuilder() 
      .removeHeader("x-frame-options") 
      .removeHeader("frame-options") 
      .build(); 
      return new WebResourceResponse("text/html", 
      modifiedResponse.header("content-encoding", "utf-8"), 
      modifiedResponse.body().byteStream() 
     ); 

    } catch(MalformedURLException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    } 
関連する問題