2016-07-02 6 views
0

現在のユーザーエージェントを偽装しようとする単純なChrome拡張機能を作成しています。私はちょうど約this questionを見つけ、私のコードで実装しました。ドキュメントの読み込み後にカスタムナビゲータが上書きされる

は以下のdocument_startで実行するように設定された現在のユーザーエージェント文字列を置換しようとするコンテンツスクリプト、次のとおりです。ただし

let useragent, actualCode, timer = null; 
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { 
    if (request.useragent) { 
    sendResponse({error: false}); 
    useragent = request.useragent; 
    } 
    else sendResponse({error: true}); 
}); 

var receivedUA = function() { 
    if (useragent != null) { 
    window.clearInterval(timer); 
    actualCode = function(userAgent) { 
     console.log('im being called'); 
     'use strict'; 
     let navigator = window.navigator; 
     let modifiedNavigator; 

     if ('userAgent' in Navigator.prototype) { 
     modifiedNavigator = Navigator.prototype; 
     } else { 
     modifiedNavigator = Object.create(navigator); 
     Object.defineProperty(window, 'navigator', { 
      value: modifiedNavigator, 
      configurable: false, 
      enumerable: false, 
      writable: false 
     }); 
     Object.defineProperty(navigator, 'navigator', { 
      value: modifiedNavigator, 
      configurable: false, 
      enumerable: false, 
      writable: false 
     }); 
     } 

     Object.defineProperties(modifiedNavigator, { 
     userAgent: { 
      value: userAgent.useragent, 
      configurable: false, 
      enumerable: true, 
      writable: false 
     }, 
     appVersion: { 
      value: userAgent.appversion, 
      configurable: false, 
      enumerable: true, 
      writable: false 
     }, 
     platform: { 
      value: userAgent.platform, 
      configurable: false, 
      enumerable: true, 
      writable: false 
     } 
     }); 

     console.dir(modifiedNavigator); 

    }; 
    let evt = new Event('reset'); 
    document.documentElement.addEventListener('reset', actualCode(useragent)); 
    document.documentElement.dispatchEvent(evt); 
    document.documentElement.removeEventListener('reset', actualCode(useragent)); 
    } 
    else { 
    window.clearTimeout(timer); 
    timer = window.setTimeout(receivedUA, 100); 
    } 
} 
receivedUA(); 

、私はwhatsmyua.comのテストだし、コードが呼び出されたときドキュメントの読み込みが開始されますが、読み込んだ後には、実際のユーザーエージェントが表示され、コンソールにwindow.navigator.userAgentと入力すると同じ結果が返されます。私はここで何が欠けていますか?

答えて

0

おそらく、chrome.webRequest API hereを使用すると、このような複雑さを回避する必要があります。あなたがソースコードをチェックする場合も

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(details) { 
     for (var i = 0; i < details.requestHeaders.length; ++i) { 
      if (details.requestHeaders[i].name === 'User-Agent') { 
       console.log(details.requestHeaders[i]); 
       break; 
      } 
      } 
      return {requestHeaders: details.requestHeaders}; 
    }, 
    {urls: ["<all_urls>"]}, 
    ["blocking", "requestHeaders"] 
); 

..あなたは、あなたのバックグラウンドスクリプトにこれを追加する必要があります

+1

あなたの提案は 'window.navigator'には影響しないので、特にうまくいかなかった理由を説明していると思います。 –

+0

私はすでにこの部分を自分のコードで使用しています。私は大部分のウェブサイトが 'window.navigator'を利用してHTTPヘッダの代わりにユーザエージェントを検索していると思います。 – Alexandre

+0

それで、上書きされないようにするためにできることはありますか? – Alexandre

0

hereを参照してください):ここでは上記のリンクからの出力User-Agentヘッダのオブジェクトがしますビット変形例がありますだからここに答えはタイミングである

function getUa() { return decodeURIComponent(location.hash.replace('#', '')) || navigator.userAgent; }

:それは身体の先頭にインラインスクリプトでページの読み込みでユーザーエージェントを取得することをhttp://www.whatsmyua.com/のあなたが見ることができる人コンテンツスクリプトやページスクリプトの方が高速になります。 ページが勝っています。それは、コンテンツスクリプトがそれを無効にする前にユーザーエージェントを取得します。

このページをhtmlとしてダウンロードし、localhostで実行し、タイミングを測定するタイムスタンプ付きの追加ロギングを追加できます。

また、コンテキストスクリプトに"run_at": "document_start"を使用していることを確認してください。

関連する問題