[javascript] 2012 년 6 월 12 일 이후로 내 웹 사이트에서 요청 된 URL의 1 %에 “정의되지 않음”이 무작위로 추가됨

2012 년 6 월 12 일 11:20 TU 이후로 내 바니시 / 아파치 로그에 매우 이상한 오류가 표시됩니다.

때로는 사용자가 한 페이지를 요청했을 때 몇 초 후에 비슷한 요청이 표시되지만 URL의 마지막 / 뒤의 모든 문자열이 “정의되지 않음”으로 대체되었습니다.

예 :
http://example.com/foo/barhttp://example.com/foo/undefined 요청을 트리거합니다 .

물론 이러한 “정의되지 않은”페이지는 존재하지 않고 대신 내 404 페이지가 반환됩니다 (클래식 apache 404가 아닌 표준 레이아웃이있는 사용자 정의 페이지).

  • 이것은 홈페이지에서 가장 깊은 페이지까지 모든 페이지에서 발생합니다.
  • 다양한 브라우저 (대부분 Chrome 19, 파이어 폭스 3.5 ~ 12, IE 8/9 …)를 사용하지만 트래픽의 1 %에 불과합니다.
  • 이러한 요청에 의해 전송 된 헤더는 클래식 헤더이며 ajax 헤더가 없습니다.
  • 주어진 IP에 대해 이것은 무작위로 발생하는 것처럼 보입니다 : 때로는 방문한 첫 페이지에서, 때로는 방문 중 임의의 페이지에서, 때로는 방문 중 여러 페이지에서 …

물론 자바 스크립트 문제처럼 보이지만 (Google에서 호스팅하는 jquery 1.7.2를 사용 하고 있습니다) 며칠 이후 js / html 또는 서버 구성에서 아무것도 변경 되지 않았으며 이전에 이런 종류의 오류를 본 적이 없습니다. . 물론 html에는 그러한 링크가 없습니다.

또한 몇 가지 흥미로운 사실을 발견했습니다.

  • 정의되지 않은 요청은 다른 페이지의 참조 자로 발견되지 않지만 대신 “실제”페이지가 동일한 IP의 다음 요청에 대한 참조 자로 사용되었습니다 (사용자는 404 페이지에서 클래식 메뉴를 사용할 수 있음).
  • Google Analytics에서 이러한 페이지의 흔적을 보지 못했기 때문에 자바 스크립트가 실행되지 않았다고 가정합니다 (404를 포함한 모든 페이지에 추적기가 존재 함).
  • 웹 사이트의 소셜 네트워크에서 문제를 제기 한 경우에도 아무도 이에 대해 문의하지 않았습니다.
  • 대부분의 사용자는 그 이후에도 계속 방문합니다.

이 모든 사실로 인해 브라우저에서 문제가 조용히 발생한다고 생각합니다. 아마도 버그가 많은 애드온, 바이러스 백신, 브라우저 바 또는 어제 업데이트 된 브라우저에 통합 된 형편없는 제조업체 소프트에 의해 유발되었을 것입니다 (하지만 출시 된 애드온을 찾지 못했습니다). 어제 크롬, 파이어 폭스, IE).

여기에있는 사람이 동일한 문제를 발견했거나 더 완전한 설명이 있습니까?



답변

단순한 정답은 없습니다.

이것을 디버깅해야 할 것이고 URL의 ‘정의되지 않은’단어로 인해 아마도 JavaScript 일 것입니다. 그러나 AJAX 일 필요는 없으며 브라우저에 의해 자동으로 확인되는 URL을 생성하는 JavaScript 일 수 있습니다 (예 : 이미지 태그에 src 속성을 설정하는 JavaScript, css-image 속성 설정 등). 나는 대부분의 경우 Firebug가 설치된 Firefox 를 사용 하므로 내 지침을 염두에 두겠습니다.

Firebug 초기 설정

Firebug 사용 방법을 이미 알고있는 경우이 단계를 건너 뛰십시오.

Firefox for Firebug를 설치하고 다시 시작한 후에는 대부분의 Firebug ‘패널’을 활성화해야합니다. Firebug를 열려면 브라우저의 오른쪽 상단에 약간의 화재 버그 / 곤충 모양이 있거나 F12 키를 누를 수 있습니다. Firebug 탭 ‘Console’, ‘Script’, ‘Net’을 클릭하고이를 열고 패널의 정보를 읽어 활성화합니다. 제대로 작동하려면 페이지를 새로 고쳐야 할 수 있습니다.

사용자 상호 작용 디버깅

Firebug가 열려 있고 Net 패널이 활성화 된 문제가있는 페이지 중 하나로 이동합니다. Net 패널에는 ‘Clear’, ‘Persist’, ‘All’, ‘Html’등 몇 가지 옵션이 있습니다. ALL이 선택되어 있는지 확인하십시오. 페이지에서 아무 작업도하지 말고 페이지 위에 마우스를 올려 놓지 마십시오. 요청을 살펴보십시오. 잘못된 URL에 대한 요청은 빨간색이며 404 찾을 수 없음 (또는 유사) 상태 일 수 있습니다.

로드시 보십니까? 다음 부분으로 건너 뜁니다.

초기로드시 보이지 않습니까? 페이지 사용을 시작하고 여기에서 계속하십시오.

모든 기능을 클릭하고 모든 항목 위에 마우스를 올려 놓으십시오. Net 패널을 계속 주시하고 실패한 요청을 확인하십시오. 창의적이어야 할 수도 있지만 브라우저가 잘못된 요청을 할 때까지 애플리케이션을 계속 사용하십시오. 페이지가 많은 요청을하는 경우 Net 패널의 왼쪽 상단에있는 ‘Clear’버튼을 눌러서 조금 정리하십시오.

페이지를 제출하고 실패한 요청이 매우 빨리 나가지 만 다음 페이지가로드되어 손실되는 경우 Net 패널의 왼쪽 상단에있는 ‘Persist’를 클릭하여 지속성을 활성화하십시오.

일단 그렇게되면, 그렇게하기 위해 무엇을했는지 고려하십시오. 다시 일어날 수 있는지 확인하십시오. 어떤 사용자 상호 작용이 발생하는지 파악한 후 해당 코드를 살펴보고 잘못된 요청을 만드는 항목을 찾습니다.

스크립트 탭을 사용하여 JavaScript에서 중단 점을 설정하고 단계별로 실행할 수 있습니다. $ (elemment) .bind / click / focus / etc를 통해 또는 onclick = “”/ onfocus = “”등과 같은 구식 이벤트 속성에서 수행 된 이벤트 핸들러를 조사하십시오.

페이지가로드되는 즉시 요청이 발생하는 경우

이것은 고정하기가 조금 더 어려울 것입니다. 스크립트 탭으로 이동하여로드시 실행되는 모든 스크립트에 중단 점 추가를 시작해야합니다. 자바 스크립트 줄의 왼쪽을 클릭하면됩니다.

페이지를 새로 고침하면 중단 점이 브라우저에서 페이지를로드하지 못하도록합니다. 스크립트 패널에서 ‘계속’버튼을 누릅니다. 인터넷 패널로 이동하여 요청이 이루어 졌는지 확인하고 찾을 때까지 계속하십시오. 이를 사용하여 점점 더 많은 중단 점을 천천히 추가 한 다음 함수에 들어갔다 나오면 요청이 발생하는 위치를 좁힐 수 있습니다.

코드에서 찾고있는 것

다음과 유사한 것 :

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

var url = workingUrl + someObject.someProperty;

someObject는 object {}, array []또는 내부 브라우저 유형 중 하나 일 수 있습니다. 요점은 존재하지 않는 속성에 액세스한다는 것입니다.

404 / 빨간색 요청이 보이지 않습니다.

그런 다음 원인이 무엇이든 테스트에 의해 트리거되지 않습니다. 더 많은 것을 사용해보십시오. 요점은 어떻게 든 요청을 할 수 있어야한다는 것입니다. 당신은 아직 모릅니다. Net 패널에 표시되어야합니다. 그렇지 않은 유일한 시간은 트리거를 유발하는 작업을 수행하지 않을 때입니다.

결론

정확히 무슨 일이 벌어지고 있는지에 대한 아주 쉬운 방법은 없습니다. 그러나 내가 설명한 방법을 사용하면 최소한 가까이 다가 갈 수 있어야합니다. 아마도 당신이 고려하지도 않은 것입니다.


답변

게시물을 기반으로 “Complitly”Chrome 플러그인 / 멀웨어를 리버스 엔지니어링했으며이 확장 프로그램이 NAME 또는 “검색”, “q”등의 ID입니다.

또한 enable.js 파일 (컴플리트 파일 중 하나)이 “suggestmeyes_loaded”라는 전역 변수를 확인하여 이미로드되었는지 확인했습니다 (예 : Singleton). 따라서이 변수를 false로 설정하면 플러그인이 비활성화됩니다.

멀웨어를 비활성화하고 “정의되지 않은”요청을 중지하려면 사이트에 검색 필드가있는 모든 페이지에이를 적용하십시오.

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

또한이 악성 코드는 사용자를 “searchcompletion.com”사이트로 리디렉션하여 때때로 경쟁 업체에 ADS를 표시합니다. 그래서 진지하게 받아 들여야합니다.


답변

undefinedJavaScript 문제와 관련 이 있음을 올바르게 설정했으며 사이트 사용자가 오류 페이지 표시에 대해 불만을 제기하지 않은 경우 다음을 확인할 수 있습니다.

JavaScript가 이미지 위치를 설정하거나 변경하는 데 사용되는 경우 때때로이 undefinedURI로 이동합니다.

이 경우 브라우저는 기꺼이 이미지를로드하려고 시도하지만 (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));


답변

특히이 스레드에서 확인 된 몇 가지 사실 : http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

자바 스크립트가 전혀없는 페이지에서 발생합니다. 이것은 페이지 프로그래밍 오류가 아님을 증명합니다.

사용자는 문제를 인식하지 못하고 계속해서 매우 즐겁게 탐색합니다.

사용자가 페이지를 방문한 후 몇 초 후에 발생합니다.

모든 사람에게 일어나는 일은 아닙니다.

여러 브라우저 (Chrome, IE, Firefox, Mobile Safari, Opera)에서 발생

여러 운영 체제 (Linux, Android, NT)에서 발생

여러 웹 서버 (IIS, Nginx, Apache)에서 발생

링크를 따라 가면서 동일한 리퍼러를 주장하는 googlebot 사례가 하나 있습니다. 그들은 단지 영리 해 지려고 할 수 있으며 브라우저는 그것을 조사하기 위해 봇을 만든 모선에게 전달했습니다.

나는 그것이 플러그인에 의한 것이라는 제안에 상당히 확신합니다. Complitly는 하나이지만 Opera를 지원하지 않습니다. 다른 것들이 많이 있습니다.

모바일 브라우저는 플러그인 이론에 반합니다.

시스템 관리자는 Complitly가 이미 초기화되었다고 생각하도록 속이기 위해 페이지에 일부 자바 스크립트를 추가하여 대폭 하락했다고보고했습니다.

nginx에 대한 내 솔루션은 다음과 같습니다.

location ~ undefined/?$  {
  return 204;
}

그러면 “좋아요,하지만 콘텐츠가 없습니다”가 반환됩니다.

website.com/some/page에 있고 (어쨌든) website.com/some/page/undefined로 이동하면 브라우저는 URL이 변경된 것으로 표시하지만 페이지를 다시로드하지 않습니다. 이전 페이지는 창에 그대로 유지됩니다.

어떤 이유로 이것이 사용자가 경험 한 것이라면 깨끗한 noop 경험을 갖게 될 것이며 그들이 무엇을 하던지 방해하지 않을 것입니다.


답변

이것은 변수가 사용되기 전에 제대로 초기화되지 않는 경쟁 조건처럼 들립니다. 귀하의 의견에 따르면 이것이 AJAX 문제가 아니라는 점을 고려할 때 아래에 나열된 몇 가지 방법이 있습니다.

자바 스크립트 예외 로거 연결 : 로그에서 거의 모든 임의의 자바 스크립트 예외를 포착하는 데 도움이됩니다. 대부분의 경우 프로그래밍 방식 오류가 여기에 표시됩니다. 스크립트 앞에 넣으십시오. 서버에서이를 포착하고 나중에 분석 할 수 있도록 로그에 인쇄해야합니다. 이것이 당신의 첫 번째 방어선입니다. 다음은 그 예입니다.

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 링크 자체뿐입니다. 세 번째 단계는 잘못된 URL 패턴에 대해 처리되지 않은 모든 DOM 링크를 확인하는 것입니다 (jQuery가로드를 마친 후 바로 첨부 할 수 있습니다.

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

이것이 도움이되기를 바랍니다. 행복한 디버깅.


답변

이것이 adblocker 문제인지 궁금합니다. IP 주소로 로그를 검색하면 특정 사용자가 /folder/page.html에 대한 모든 요청 뒤에 / folder / undefined에 대한 요청이 뒤 따르는 것처럼 보입니다.


답변

이것이 도움이되는지 모르겠지만 내 웹 사이트는 여러 브라우저에로드 된 후 특정 * .webp 이미지 파일을 undefined로 대체하고 있습니다. 사이트가 webp 이미지를 호스팅하고 있습니까?