Development Tip

2012 년 6 월 12 일부터 내 웹 사이트에서 요청한 URL의 1 %에 "정의되지 않음"이 무작위로 추가됨

yourdevel 2020. 10. 10. 12:07
반응형

2012 년 6 월 12 일부터 내 웹 사이트에서 요청한 URL의 1 %에 "정의되지 않음"이 무작위로 추가됨


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

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

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

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

  • 이것은 모든 페이지 (홈페이지에서 가장 깊은 곳까지)에서 발생합니다.
  • 다양한 브라우저 (대부분 크롬 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 사용 방법을 이미 알고있는 경우이 단계를 건너 뛰십시오.

Firebug 용 Firefox를 설치하고 다시 시작한 후에는 대부분의 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)에서 발생

I have one case of googlebot following the link and claiming the same referrer. They may just be trying to be clever and the browser communicated it to the mothership who then set out a bot to investigate.

I am fairly convinced by the proposal that it is caused by plugins. Complitly is one, but that doesn't support Opera. There many be others.

Though the mobile browsers weigh against the plugin theory.

Sysadmins have reported a major drop off by adding some javascript on the page to trick Complitly into thinking it is already initialized.

Here's my solution for nginx:

location ~ undefined/?$  {
  return 204;
}

This returns "yeah okay, but no content for you".

If you are on website.com/some/page and you (somehow) navigate to website.com/some/page/undefined the browser will show the URL as changed but will not even do a page reload. The previous page will stay as it was in the window.

If for some reason this is something experienced by users then they will have a clean noop experience and it will not disturb whatever they were doing.


This sounds like a race condition where a variable is not getting properly initialized before getting used. Considering this is not an AJAX issue according to your comments, there will be a couple of ways of figuring this out, listed below.

Hookup a Javascript exception Logger: this will help you catch just about all random javascript exceptions in your log. Most of the time programmatic errors will bubble up here. Put it before any scripts. You will need to catch these on the server and print them to your logs for analysis later. This is your first line of defense. Here is an example:

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);
};

Search for window.location: for each of these instances you should add logging or check for undefined concats/appenders to your window.location. For example:

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

or the slightly cleaner:

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
} 

If you are interested in getting stacktraces at this stage take a look at: https://github.com/eriwen/javascript-stacktrace

Grab all unhandled undefined links: Besides window.location The only thing left are the DOM links themselves. The third step is to check all unhandeled DOM links for your invalid URL pattern (you can attach this right after jQuery finishes loading, earlier better):

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

Hope this is helpful. Happy debugging.


I'm wondering if this might be an adblocker issue. When I search through the logs by IP address it appears that every request by a particular user to /folder/page.html is followed by a request to /folder/undefined


I don't know if this helps, but my website is replacing one particular *.webp image file with undefined after it's loaded in multiple browsers. Is your site hosting webp images?


I had a similar problem (but with /null 404 errors in the console) that @andrew-martinez's answer helped me to resolve.

Turns out that I was using img tags with an empty src field:

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

My idea was to prevent browser from loading the image at page load to manually load later by setting the src attribute from the data-src attribute with javascript (lazy loading). But when combined with iDangerous Swiper, that method caused the error.

참고URL : https://stackoverflow.com/questions/11017609/undefined-randomly-appended-in-1-of-requested-urls-on-my-website-since-12-jun

반응형