2012年6月12日以降、私のWebサイトで要求されたURLの1%に「未定義」がランダムに追加されました


80

2012年6月12日11:20TU以降、ワニス/ Apacheログに非常に奇妙なエラーが表示されます。

ユーザーが1ページをリクエストすると、数秒後に同様のリクエストが表示されることがありますが、URLの最後の/の後のすべての文字列が「undefined」に置き換えられています。

例:http//example.com/foo/barhttp://example.com/foo/undefinedリクエストをトリガーします。

もちろん、これらの「未定義」ページは存在せず、代わりに私の404ページが返されます(これは、従来のApache 404ではなく、標準レイアウトのカスタムページです)。

  • これはすべてのページで発生します(ホームページから最も深いところまで)
  • さまざまなブラウザ(主にChrome 19ですが、Firefox 3.5から12、IE 8/9 ...)を使用しますが、トラフィックの1%にすぎません。
  • これらのリクエストによって送信されるヘッダーはクラシックヘッダーです(そしてajaxヘッダーはありません)。
  • 特定のIPについて、これはランダムに発生するようです。最初にアクセスしたページ、訪問中のランダムなページ、訪問中の複数のページなどです。

もちろん、JavaScriptの問題のように見えますが(Googleがホストするjquery 1.7.2を使用しています)、js / htmlまたはサーバー構成にまったく変更はありません。、数日以来なく、この種のエラーはこれまで見たことがありません。そしてもちろん、htmlにはそのようなリンクはありません。

また、いくつかの興味深い事実に気づきました。

  • 未定義のリクエストが別のページのリファラーとして検出されることはありませんが、代わりに「実際の」ページが同じIPの次のリクエストのリファラーとして使用されました(ユーザーは404ページのクラシックメニューを使用できます)
  • Google Analyticsでこれらのページの痕跡が見られなかったので、JavaScriptが実行されていないと思います(トラッカーは404を含むすべてのページに存在します)
  • ウェブサイトのソーシャルネットワークで問題を引き起こしたときでさえ、誰もこれについて私たちに連絡していません
  • ほとんどのユーザーはその後も訪問を続けます

これらすべての事実から、問題はブラウザで静かに発生していると思います。おそらく、バグのあるアドオン、アンチウイルス、ブラウザバー、または昨日更新されたブラウザにソフト統合された安っぽいメーカーが原因です(ただし、リリースされたアドオンは見つかりませんでした)昨日はchrome、firefox、IE)。

ここの誰かが同じ問題に気づいたか、またはより完全な説明がありますか?


2
ページ上の一部のJavaScriptコードがURLを作成しており、1つ以上のバグがあります。ソフトウェアは、それ自体を変更せずに、ブラウザの更新、日付/時刻への感度、サードパートのスクリプトの変更などによって動作を変更する可能性があります。コードを見なければ、何が問題なのかを正確に特定することは不可能です。
とがった2012年

3
デバッグのヒント/アイデア:-404ページに、かなり大きな文字で「これが表示された場合は、x @ yzに連絡して、ここに到達した方法を説明してください」という明確なメッセージを配置します(おそらくlocation.href.search("undefined")trueの場合にのみ表示されます)。-メールがなく、どこでもjquery ajaxを使用している場合は、jquery ajax呼び出しをカスタム関数でラップします。カスタム関数は、返されたデータがJSONであるかどうか、data.undefinedErrorが存在するかどうかを最初にチェックし、存在する場合はどこかにログを記録します(+チェックを作成しますURLに{undefinedError:true}ある場合に返される404 undefined)。
David Mulder 2012年

3
私もこれを経験しており、どちらもボットだとは思いません。どちらも/キャッシュ/ XXXXおよび/未定義しかし、それだけではなくクローム19が、また、あるIE 8と9

3
6月12日以降、{domain} / undefinedエラーも発生しています。私は自分のサイト(グーグルアナリティクス、アドセンスなど)からすべてのJavaScriptを削除しようとしましたが、それでもエラーが表示されます。それらの数は毎日増加しています。ほとんどすべてのエラーは、異なるバージョンのChromeを使用するユーザーによって生成されます。いくつかの拡張機能またはアドインであると思われますが、自分のPCでは再現できません。また、/ undefinedを含むリクエストは、すべてのサブリクエスト(画像、cssなど)を含む正しいページリクエストの後に常に続くことにも言及しました
Almas 2012年

3
6月12日に始まったという別のレポート:productforums.google.com/forum
#!

回答:


21

簡単な正解はありません。

これをデバッグする必要があります。URLに「undefined」という単語が含まれているため、おそらくJavaScriptです。ただし、AJAXである必要はありません。ブラウザによって自動的に解決されるURLを作成するJavaScript(たとえば、画像タグにsrc属性を設定するJavaScript、css-image属性を設定するJavaScriptなど)である可能性があります。私は使用のFirefoxFirebugのが私の方向は心の中でそれとなりますので、ほとんどの時間をインストールしました。

Firebugの初期設定

Firebugの使用方法をすでに知っている場合は、これをスキップしてください。

Firefox for Firebugをインストールして再起動した後、Firebugの「パネル」のほとんどを有効にする必要があります。Firebugを開くには、ブラウザの右上隅に小さなFire Bug /昆虫のようなものがあります。または、F12キーを押すこともできます。Firebugタブの「コンソール」、「スクリプト」、「ネット」をクリックし、それらを開いてパネルの情報を読んで有効にします。正しく機能させるには、ページを更新する必要がある場合があります。

ユーザーインタラクションのデバッグ

Firebugが開いていて、ネットパネルがアクティブであるという問題があるページの1つに移動します。ネットパネルには、「クリア」、「永続化」、「すべて」、「HTML」などのいくつかのオプションがあります。すべてが選択されていることを確認してください。ページ上で何もしないでください。また、ページ上でマウスを動かさないようにしてください。リクエストに目を通します。無効なURLのリクエストは赤で表示され、ステータスは404 Not Found(または同様)である可能性があります。

ロード時にそれを見ますか?次のパートにスキップします。

初期ロード時に表示されませんか?ページの使用を開始し、ここに進みます。

すべての機能をクリックし始め、すべての上にマウスを置きます。ネットパネルに注目し、失敗するリクエストに注意してください。創造性を発揮する必要があるかもしれませんが、ブラウザが無効なリクエストを行うのがわかるまで、アプリケーションを使い続けてください。ページから多くのリクエストがあった場合は、ネットパネルの左上にある[クリア]ボタンを押して、少しクリアしてください。

ページを送信し、失敗したリクエストがすぐに消えて、次のページが読み込まれるために失われた場合は、ネットパネルの左上にある[永続化]をクリックして永続化を有効にします。

それができたら、そしてそうすべきですが、それを実現するためにあなたが何をしたかを考えてください。あなたがそれを再び実現できるかどうか見てください。どのようなユーザーインタラクションがそれを引き起こしているのかを理解したら、そのコードに飛び込んで、無効な要求を行っているものを探し始めます。

[スクリプト]タブを使用して、JavaScriptにブレークポイントを設定し、それらをステップスルーできます。$(elemment).bind / click / focus / etcを介して、またはonclick = "" / onfocus = ""などの古い学校のイベント属性から実行されたイベントハンドラーを調査します。

ページが読み込まれるとすぐにリクエストが発生する場合

これは、固定するのが少し難しくなります。[スクリプト]タブに移動し、ロード時に実行されるすべてのスクリプトにブレークポイントの追加を開始する必要があります。これを行うには、JavaScriptの行の左側をクリックします。

ページをリロードすると、ブレークポイントによってブラウザがページをロードできなくなります。スクリプトパネルの[続行]ボタンを押します。ネットパネルに移動して、リクエストが行われたかどうかを確認し、見つかるまで続行します。これを使用して、ブレークポイントを徐々に追加し、関数にステップインおよびステップアウトすることで、リクエストの送信元を絞り込むことができます。

コードで探しているもの

次のようなもの:

var url = workingUrl + someObject['someProperty'];

var url = workingUrl + someObject.someProperty;

someObjectは、オブジェクト{}、配列[]、または内部ブラウ​​ザタイプのいずれかである可能性があることに注意してください。重要なのは、存在しないプロパティにアクセスするということです。

404 /赤のリクエストが表示されません

その後、それを引き起こしているものは何でもあなたのテストによって引き起こされていません。もっとたくさん使ってみてください。重要なのは、なんとかしてリクエストを発生させることができるはずです。あなたはまだ知りません。ネットパネルに表示する必要があります。それが起こらないのは、それをトリガーするものを何もしていないときだけです。

結論

正確に何が起こっているのかを突き止めるための非常に簡単な方法はありません。しかし、私が概説した方法を使用すると、少なくとも近づくことができるはずです。それはおそらくあなたが考えていないことです。


1
お返事をありがとうございます。私はすでにfirebugを使用して、IPでニス/ Apacheログを監視することでこれを検査しようとしましたが、成功しませんでした。これらの「未定義」リクエストは、すべてのhtmlリクエストの1%未満であり、すべてのタイプのページが関係しているため、それらをトリガーするのは非常に困難です。しかし、来週は別のブラウザーで再試行し、あなたが言ったようにイベントハンドラーをより深く調査します。ありがとう!
colinux 2012年

のようなものである可能性が高く、var url = omeObject['usuallyAURL'];リクエストされたアセットのsrcまたはhrefとして設定されているため、相対パスリクエストとして扱われると思います。すなわち<img src="undefined" />
Yahel 2012年

17

この投稿に基づいて、「完全に」Chromeプラグイン/マルウェアをリバースエンジニアリングしたところ、この拡張機能が「改善されたオートコンプリート」機能を注入しており、NAMEまたは「検索」、「q」、その他多数のID。

また、enable.jsファイル(完全なファイルの1つ)が「suggestmeyes_loaded」というグローバル変数をチェックして、すでにロードされているかどうか(シングルトンなど)を確認していることもわかりました。したがって、この変数をfalseに設定すると、プラグインが無効になります。

マルウェアを無効にして「未定義」のリクエストを停止するには、サイトに検索フィールドがあるすべてのページにこれを適用します。

<script type="text/javascript">
    window.suggestmeyes_loaded = true;
</script>

このマルウェアはまた、ユーザーを「searchcompletion.com」サイトにリダイレクトし、競合他社のADSを表示することもあります。ですから、真剣に受け止めるべきです。


私のログにもこれが表示されており、JSにはなり得ないページがあります。私はあなたが100%正しいと信じています。マルウェアがこの変数の名前を変更するまでにどれくらいかかるのだろうかと思いますが。
ローレンスドル2013

私の場合、かなりもっともらしいように聞こえます。1つの例外:要求されたURL:/ ForSale / beach_front_property / bronx / undefined /ユーザーエージェント:Mozilla / 5.0(互換性; Googlebot / 2.1; + google.com/bot.html)googlebotがそれを見つけてフォローする理由がわかりません。彼らがどこかでURLを検出し、行ってみない限り、見てください。しかし、ボットは正しいリファラーURLを示しています
Chris Sattinger 2013年

別の例外:ユーザーエージェント:Opera / 9.80(Windows NT 5.1)Presto /2.12.388バージョン/12.16Operaでは完全に利用できません。Linux、Android、NTもたくさんあります
Chris Sattinger 2013年

@felix GooglebotがURLについて学習する1つの場所は、ブラウザが「電話を
かける

8

undefinedJavaScriptの問題に関連していることを正しく確認しました。サイトのユーザーがエラーページの表示について不満を言っていない場合は、次のことを確認できます。

JavaScriptを使用して画像の場所を設定または変更undefinedすると、URIに侵入することがあります。

その場合、ブラウザは喜んで画像を読み込もうとしますが(AJAXヘッダーなし)、ヒントがAccept:残ります。特定のヘッダーを設定します。代わりにtext/html, text/xml, ...を使用しますimage/jpeg, image/png, ...

このようなヘッダーが確認されたら、問題を画像のみに絞り込みます。ただし、根本原因の特定には時間がかかる可能性があります:)

更新

デバッグを支援する$.fn.attr()ために、undefinedに何かが割り当てられているときに、デバッガーをオーバーライドして呼び出すことができます。このようなもの:

​(function($, undefined) {
    var $attr = $.fn.attr;

    $.fn.attr = function(attributeName, value) {
        var v = attributeName === 'src' ? value : attributeName.src;

        if (v === 'undefined') {
            alert("Setting src to undefined");
        }

        return $attr(attributeName, value);
    }
}(jQuery));

そうです、ヘッダーのおかげで私はリードすることができました。Chromeリクエストの場合、ヘッダーは(コメントの書式がHost: statistiks.fr User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5 Accept: */* Referer: http://statistiks.fr/basket-ball/[..] Accept-Encoding: gzip,deflate,sdch [...] 正しくないため申し訳ありません)ですが、IE9では、Acceptヘッダーが画像を参照しています。Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 来週は画像側で調査する時間を取ります。ありがとう!
colinux 2012年

@colinux問題を簡単に見つけられるように、回答を更新しました。それを適用するのに問題があれば私に知らせてください。
ジャック

3

特にこのスレッドで確立されているいくつかの事実:http//productforums.google.com/forum/#!msg / chrome / G1snYHaHSOc / p8RLCohxz2kJ

これは、JavaScriptがまったくないページで発生します。これは、それがページ上のプログラミングエラーではないことを証明します

ユーザーは問題に気づかず、非常に楽しく閲覧し続けます。

その人がページにアクセスしてから数秒後に発生します。

それは誰にも起こりません。

複数のブラウザ(Chrome、IE、Firefox、Mobile Safari、Opera)で発生します

複数のオペレーティングシステム(Linux、Android、NT)で発生します

複数のWebサーバー(IIS、Nginx、Apache)で発生します

リンクをたどって同じリファラーを要求しているgooglebotのケースが1つあります。彼らは賢くしようとしているだけかもしれません、そしてブラウザはそれを母船に伝えました、そしてそれはそれから調査するためにボットを始めました。

私はそれがプラグインによって引き起こされているという提案にかなり確信しています。完全に1つですが、Operaはサポートしていません。他にもたくさんあります。

モバイルブラウザはプラグイン理論に反しますが。

システム管理者は、ページにjavascriptを追加して、完全に初期化されていると思わせることで、大幅な減少を報告しています。

これがnginxの私の解決策です:

location ~ undefined/?$  {
  return 204;
}

これは「ええ、大丈夫ですが、あなたのためのコンテンツはありません」を返します。

あなたがwebsite.com/some/pageにいて、(どういうわけか)website.com/some/page/undefinedに移動した場合、ブラウザは変更されたURLを表示しますが、ページのリロードも行いません。前のページはウィンドウに表示されたままになります。

何らかの理由でこれがユーザーが経験するものである場合、ユーザーはクリーンなヌープエクスペリエンスを体験し、何をしていたとしても邪魔になりません。


あなたの解決策は間違いなくこれの失敗から私を救いました。ブラウザは混合コンテンツ(sslとplain)について不平を言っていましたが、これは解決されました。ありがとうございます。
Moritz

2

これは、変数が使用される前に適切に初期化されていない競合状態のように聞こえます。あなたのコメントによると、これはAJAXの問題ではないことを考えると、これを理解する方法がいくつかあります。以下にリストします。

Javascript例外ロガーを接続する:これは、ログ内のほぼすべてのランダムなjavascript例外をキャッチするのに役立ちます。ほとんどの場合、プログラムエラーはここで発生します。スクリプトの前に置きます。これらをサーバーでキャッチし、後で分析するためにログに出力する必要があります。これがあなたの最初の防衛線です。次に例を示します。

window.onerror = function(m,f,l) {
    var e = window.encodeURIComponent;
    new Image().src = "/jslog?msg=" + e(m) + "&filename=" + e(f) + "&line=" + e(l) + "&url=" + e(window.location.href);
};

window.locationを検索します。これらのインスタンスごとに、ログを追加するか、window.locationに未定義の連結/アペンダーがないかどうかを確認する必要があります。例えば:

function myCode(loc) {
    // window.location.href = loc; // old 
    typeof loc === 'undefined' && window.onerror(...); //new
    window.location.href = loc; //new
}

または少しきれい:

window.setLocation = function(url) { 
   /undefined/.test(url) ? 
         window.onerror(...) : window.location.href = url;       
}

function myCode(loc) {
    //window.location.href = loc; //old
    window.setLocation(loc); //new
} 

この段階でスタックトレースを取得することに興味がある場合は、https//github.com/eriwen/javascript-stacktraceをご覧ください。

未処理の未定義のリンクをすべて取得します。window.location以外に残っているのは、DOMリンク自体だけです。3番目のステップは、処理されていないすべてのDOMリンクで無効なURLパターンをチェックすることです(jQueryの読み込みが完了した直後にこれを添付できます。以前の方が適切です)。

$("body").on("click", "a[href$='undefined']", function() {
    window.onerror('Bad link: ' + $(this).html()); //alert home base
});

これがお役に立てば幸いです。ハッピーデバッグ。


1

これがアドブロッカーの問題である可能性があるのではないかと思います。IPアドレスでログを検索すると、特定のユーザーによる/folder/page.htmlへのすべての要求の後に、/ folder / undefinedへの要求が続くように見えます。


これはクライアントのソフトウェアにも関係していると思います。最近のログに基づくと、これは特定のIPアドレスでのみ発生し、それらのアドレスでも一貫して発生するようです。ユーザーエージェント文字列にBTRS123368とAskTbORJ / 5.15.2.23037が表示されますが、これらのいずれかに関連している可能性があります。
Jorrit Schippers 2013

さらにいくつかの結果が得られました。ユーザーエージェントにFunWebProductsを持っている人が、/ undefinedURLを要求しています。
Jorrit Schippers 2013

0

これが役立つかどうかはわかりませんが、私のWebサイトでは、複数のブラウザに読み込まれた後、特定の* .webp画像ファイルが未定義に置き換えられています。あなたのサイトはwebp画像をホストしていますか?


0

私は同様の問題を抱えていました(しかし /null@ andrew-martinezの回答が解決に役立っ、コンソールに404エラーがありました)。

img空のsrcフィールドを持つタグを使用していたことがわかりました。

<img src="" alt="My image" data-src="/images/my-image.jpg">

私の考えは、javascriptを使用してdata-src属性からsrc属性を設定することにより、ブラウザがページの読み込み時に画像を読み込んで後で手動で読み込むのを防ぐことでした(遅延読み込み)。しかし、iDangerous Swiperと組み合わせると、その方法でエラーが発生しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.