6

ブラウザのアドオン、プロキシ、xss などによってページに読み込まれる可能性のある外部スクリプトを検出することは可能ですか?

次の Web ページがあるとします。

<html>
    <head>
        <title>Hello world!</title>
        <script src="http://mydomain.com/script.js"></script>
    </head>
    <body>
        Hello world!
    </body>
</html>

ページ上の他スクリプト要素script.jsが.http://mydomain.com

ソースに何らかの形で含まれている他のスクリプト(つまり、onload イベントが発生したときに存在するスクリプト) と、ページの読み込み後に追加されたスクリプトを検出できるものが必要です。

それらのスクリプトを検出できれば、どうにかして停止することはできますか?

これは、ユーザーから報告された javascript/ui の問題をデバッグするのに役立ちます。

私はjQueryを使用しているため、jQueryの回答が機能します。回答を jQuery だけに制限したくなかっただけです。


編集

私の解決策は以下です。ただし、2 つの (潜在的な) 問題があります。

  1. jQueryに依存します。
  2. CSS @import ルール (またはurl()値を持つルール) を介してロードされた外部リソースは検出されません。

これらの問題の一方または両方を解決する回答を誰かが提出したい場合は、賛成します。

あなたが両方を解決するなら、私はあなたの答えを受け入れます。

4

4 に答える 4

3

次のように、domready のすべてのスクリプト要素を確認できます。

$(function () {
    $('script').each(function () {
        check script source here
    })
})

しかし、誰かがあなたの側にスクリプト タグを挿入できる場合、チェックを開始する前にコードを削除することもできます。また、スクリプトが作成する可能性のあるオブジェクトや関数を、認識される前に削除することは困難です。

ですから、この分野に時間を投資し始めるのは良い解決策だとは思いません。とにかくクライアントを信頼できないことを明確にすることがはるかに重要です。

とにかく理解したいので、DOMツリーが変更されたかどうかを確認するDOMイベントがたくさんあります。

于 2012-04-18T21:30:11.033 に答える
1

受け取った回答に満足できなかったので ( Andreas Köberle のアドバイスには感謝していますが)、自分でこれに取り組むことにしました。

オンデマンドで実行でき、外部ソースを持つ html 要素を識別できる関数を作成しました。このようにして、javascript エラーを報告するたびにこれを実行して、環境に関する詳細情報を取得できます。

コード

jQueryに依存します(申し訳ありませんが、要素の選択は非常に簡単でした)およびparseUri()(この回答の下部にコピーされています)

/**
 * Identifies elements with `src` or `href` attributes with a URI pointing to
 * a hostname other than the given hostname. Defaults to the current hostname.
 * Excludes <a> links.
 * 
 * @param string myHostname The hostname of allowed resources.
 * @return array An array of `ELEMENT: src` strings for external resources.
 */
function getExternalSources(myHostname)
{
    var s, r = new Array();
    if(typeof myHostname == 'undefined')
    {
        myHostname = location.hostname;
    }
    $('[src], [href]:not(a)').each(function(){
        s = (typeof this.src == 'undefined' ? this.href : this.src);
        if(parseUri(s).hostname.search(myHostname) == -1)
        {
            r.push(this.tagName.toUpperCase() + ': ' + s);
        }
    });
    return r;
}

使用法

var s = getExternalSources('mydomain.com');
for(var i = 0; i < s.length; i++)
{
    console.log(s[i]);
}

// Can also do the following, defaults to hostname of the window:
var s = getExternalSources();

検索にはサブドメインが含まれるため、上記の例ではソースがwww.mydomain.comorの要素img.mydomain.comが許可されます。

@importこれは、CSSルール(またはその件については を含む CSSルール)の外部ソースを検出しないことに注意してくださいurl()。誰かがそれを行うことができるコードに貢献したい場合は、私はあなたの答えに賛成票を投じて受け入れます。


以下は、 https://gist.github.com/1847816parseUri()から取得した(少し変更した)のコードです。

(function(w, d){
    var a,
        k = 'protocol hostname host pathname port search hash href'.split(' ');
    w.parseUri = function(url){
        a || (a = d.createElement('a'));
        a.href = url;
        for (var r = {}, i = 0; i<8; i++)
        {
            r[k[i]] = a[k[i]];
        }
        r.toString = function(){return a.href;};
        r.requestUri = r.pathname + r.search;
        return r;
    };
})(window, document);
于 2012-05-04T17:20:17.290 に答える
0

私は、同じオリジンポリシーがこれをカバーしていると思います: http://en.wikipedia.org/wiki/Same_origin_policy

于 2012-04-18T21:30:06.960 に答える
0

DOM の変更をリッスンして、新しいスクリプト タグが挿入されているかどうかを確認できます。しかし、そのような必要性の理由は何ですか?ページの DOM (ブックマークレットやグリースモンキー スクリプトなど) に対して任意の JS が実行される可能性のあるすべてのケースを検出できるとは思えません。

于 2012-04-18T21:21:16.327 に答える