„Nieokreślony” dodawany losowo w 1% żądanych adresów URL na mojej stronie od 12 czerwca 2012 r

80

Od 12 czerwca 2012 11:20 TU widzę bardzo dziwne błędy w moich logach lakieru / apache'a.

Czasami, gdy użytkownik zażąda jednej strony, kilka sekund później widzę podobne żądanie, ale cały ciąg po ostatnim / w adresie URL został zastąpiony przez „niezdefiniowany”.

Przykład: http://example.com/foo/bar wyzwala http://example.com/foo/undefined żądanie.

Oczywiście te „niezdefiniowane” strony nie istnieją i zamiast tego zwracana jest moja strona 404 (która jest niestandardową stroną o standardowym układzie, a nie klasycznym Apache 404)

  • Dzieje się tak w przypadku wszystkich stron (od strony głównej do najgłębszej)
  • z różnymi przeglądarkami (głównie Chrome 19, ale także Firefox 3.5 do 12, IE 8/9 ...), ale tylko 1% ruchu.
  • Nagłówki wysyłane przez to żądanie to klasyczne nagłówki (i nie ma nagłówków Ajax).
  • W przypadku danego adresu IP wydaje się, że dzieje się to losowo: czasami na pierwszej odwiedzanej stronie, czasami na przypadkowej stronie podczas wizyty, czasami na kilku stronach podczas wizyty ...

Oczywiście wygląda to na problem z javascriptem (używam jquery 1.7.2 hostowanego przez google), ale absolutnie nic się nie zmieniło w js / html ani w konfiguracji serwera od kilku dni i nigdy wcześniej nie widziałem tego rodzaju błędu . I oczywiście takich linków nie ma w html.

Zauważyłem też kilka interesujących faktów:

  • niezdefiniowane żądania nigdy nie zostały znalezione jako odnośniki innych stron, ale zamiast tego "prawdziwe" strony zostały użyte jako odnośniki dla następującego żądania o tym samym IP (użytkownik ma możliwość korzystania z klasycznego menu na stronie 404)
  • Nie widziałem żadnych śladów tych stron w Google Analytics, więc zakładam, że nie wykonano javascript (na wszystkich stronach, w tym 404, istnieje tracker)
  • nikt nie skontaktował się z nami w tej sprawie, nawet kiedy przywołałem problem w sieciach społecznościowych witryny
  • większość użytkowników kontynuuje wizytę po tym

Wszystkie te fakty sprawiają, że myślę, że problem występuje po cichu w przeglądarkach, prawdopodobnie wywołany przez wadliwy dodatek, program antywirusowy, pasek przeglądarki lub kiepski program producenta zintegrowany z przeglądarkami zaktualizowanymi wczoraj (ale nie znalazłem żadnego wydanego dodatku wczoraj dla Chrome, Firefoxa i IE).

Czy ktoś tutaj zauważył ten sam problem lub ma pełniejsze wyjaśnienie?

colinux
źródło
2
Część kodu JavaScript na twoich stronach tworzy adresy URL i ma co najmniej jeden błąd. Oprogramowanie, które samo nie jest zmieniane, może zmienić zachowanie z powodu aktualizacji przeglądarki, wrażliwości na datę / godzinę, zmiany skryptu trzeciej części itp. Bez zobaczenia kodu nie będzie można dokładnie powiedzieć, co jest nie tak.
Pointy
3
Tylko wskazówka / pomysł na debugowanie: - Umieść wyraźny komunikat na swojej stronie 404, stwierdzając dość dużymi literami „Jeśli widzisz to, czy mógłbyś skontaktować się z x @ yz, opisując, jak się tu dostałeś” (prawdopodobnie wyświetlane tylko wtedy, gdy location.href.search("undefined")jest prawdziwe). - Jeśli nie ma e-maili i wszędzie używasz jquery ajax, zawiń wywołanie jquery ajax w niestandardową funkcję, która najpierw sprawdza, czy zwrócone dane są w formacie JSON i czy data.undefinedError istnieje, a jeśli istnieje, zapisz to gdzieś (+ utwórz sprawdzenie w swoim 404, który zwraca, {undefinedError:true}jeśli istnieje undefinedw adresie URL).
David Mulder
3
Ja też tego doświadczam i nie sądzę, że to bot. Zarówno / cache / xxxx, jak i / undefined Jednak to nie tylko Chrome 19, ale także IE 8 i 9.
3
Od 12 czerwca mam też błędy {domain} / undefined. Próbowałem usunąć WSZYSTKIE javascript z mojej witryny (Google Analytics, Adsense itp.), Ale nadal pojawiają się błędy. Z każdym dniem ich liczba rośnie. Prawie wszystkie błędy są generowane przez użytkowników korzystających z Chrome w różnych wersjach. Podejrzewam, że jest to jakieś rozszerzenie lub dodatek, ale nie mogę odtworzyć na moim komputerze. Wspomniałem również, że żądanie zawierające / undefined jest zawsze realizowane po poprawnym żądaniu strony ze wszystkimi żądaniami podrzędnymi (obrazy, css itp.)
Almas
3
Kolejny raport, również, że rozpoczęła się 12 czerwca: productforums.google.com/forum/#!topic/chrome/G1snYHaHSOc
Dogweather

Odpowiedzi:

21

Nie ma prostej, prostej odpowiedzi.

Będziesz musiał to debugować i prawdopodobnie jest to JavaScript ze względu na słowo „undefined” w adresie URL. Jednak nie musi to być AJAX, może to być JavaScript tworzący dowolny adres URL, który jest automatycznie rozpoznawany przez przeglądarkę (np. JavaScript, który ustawia atrybut src w tagu obrazu, ustawia atrybut css-image itp.). Używam Firefoksa z zainstalowanym Firebugiem przez większość czasu, więc moje wskazówki będą miały to na uwadze.

Konfiguracja początkowa Firebug

Pomiń to, jeśli wiesz już, jak używać Firebuga.

Po zainstalowaniu i ponownym uruchomieniu Firefoksa dla Firebug, będziesz musiał włączyć większość „paneli” Firebuga. Aby otworzyć Firebuga, w prawym górnym rogu przeglądarki pojawi się mały pożar / owad wyglądający jak błąd lub możesz nacisnąć F12. Klikaj na zakładkach Firebug „Konsola”, „Skrypt”, „Sieć” i włącz je, otwierając je i odczytując informacje z panelu. Może być konieczne odświeżenie strony, aby działały prawidłowo.

Debugowanie interakcji użytkownika

Przejdź do jednej ze stron, na której występuje problem z otwartą aplikacją Firebug i aktywnym panelem Sieć. W panelu Net będzie kilka opcji: „Wyczyść”, „Utrwalaj”, „Wszystko”, „Html” itd. Upewnij się, że wybrana jest opcja WSZYSTKIE. Nie rób niczego na stronie i staraj się niczego na niej nie przesuwać. Przejrzyj prośby. Żądanie dotyczące nieprawidłowego adresu URL będzie czerwone i prawdopodobnie będzie miało stan 404 Nie znaleziono (lub podobny).

Widzisz to podczas ładowania? Przejdź do następnej części.

Nie widzisz tego podczas początkowego ładowania? Zacznij korzystać ze swojej strony i kontynuuj tutaj.

Zacznij klikać każdą funkcję, najedź myszką na wszystko itp. Spójrz na panel sieci i wypatruj żądań, które się nie udają. Być może będziesz musiał wykazać się kreatywnością, ale kontynuuj korzystanie z aplikacji, aż zobaczysz, że przeglądarka wysyła nieprawidłowe żądanie. Jeśli strona zawiera wiele żądań, możesz nacisnąć przycisk „Wyczyść” w lewym górnym rogu panelu sieci, aby nieco go wyczyścić.

Jeśli po przesłaniu strony zobaczysz, że nieudane żądanie zniknie bardzo szybko, ale zostanie utracone, ponieważ wczytuje się następna strona, włącz utrwalanie, klikając opcję „Utrwal” w lewym górnym rogu panelu Sieć.

Kiedy to nastąpi, a powinno, zastanów się, co zrobiłeś, aby to się stało. Sprawdź, czy możesz to powtórzyć. Gdy już zorientujesz się, jakie działania powodują interakcja użytkownika, zanurz się w tym kodzie i zacznij szukać rzeczy, które powodują nieprawidłowe żądania.

Możesz użyć zakładki Skrypt, aby ustawić punkty przerwania w swoim JavaScript i przechodzić przez nie. Zbadaj procedury obsługi zdarzeń wykonane za pomocą $ (elemment) .bind / click / focus / etc lub z atrybutów zdarzeń starej szkoły, takich jak onclick = "" / onfocus = "" itp.

Jeśli żądanie jest realizowane zaraz po załadowaniu strony

To będzie trochę trudniejsze do ustalenia. Będziesz musiał przejść do zakładki Skrypt i rozpocząć dodawanie punktów przerwania do każdego skryptu uruchamianego podczas ładowania. Robisz to klikając po lewej stronie linii JavaScript.

Załaduj ponownie stronę, a punkty przerwania powinny powstrzymać przeglądarkę przed załadowaniem strony. Naciśnij przycisk „Kontynuuj” na panelu skryptów. Przejdź do panelu sieci i sprawdź, czy żądanie zostało wysłane, kontynuuj, aż zostanie znalezione. Możesz użyć tego, aby zawęzić, skąd jest tworzone żądanie, powoli dodając coraz więcej punktów przerwania, a następnie wchodząc i wychodząc z funkcji.

Czego szukasz w swoim kodzie

Coś podobnego do następującego:

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

var url = workingUrl + someObject.someProperty;

Pamiętaj, że someObject może być obiektem {}, tablicą []lub dowolnym rodzajem przeglądarki wewnętrznej. Chodzi o to, że zostanie uzyskany dostęp do właściwości, która nie istnieje.

Nie widzę żadnych żądań 404 / czerwonych

Zatem cokolwiek powoduje, nie jest wyzwalane przez twoje testy. Spróbuj użyć więcej rzeczy. Chodzi o to, że powinieneś być w stanie w jakiś sposób zrealizować żądanie. Po prostu jeszcze nie wiesz. Musi pojawić się w panelu sieci. Nie dzieje się tak tylko wtedy, gdy nie robisz tego, co go uruchamia.

Wniosek

Nie ma bardzo łatwego sposobu na ustalenie, co dokładnie się dzieje. Jednak stosując metody, które przedstawiłem, powinieneś przynajmniej być w stanie podejść bliżej. Prawdopodobnie jest to coś, czego nawet nie rozważasz.

Andrew Martinez
źródło
1
Dzięki za twoją odpowiedź. Próbowałem już to sprawdzić za pomocą firebuga i obserwując logi lakieru / apache na moim ip, bez powodzenia. Te „niezdefiniowane” żądania stanowią mniej niż 1% wszystkich żądań html i dotyczy to wszystkich typów stron, więc naprawdę trudno je wywołać. Ale w przyszłym tygodniu spróbuję ponownie, z różnymi przeglądarkami i zbadam dokładniej programy obsługi zdarzeń, jak powiedziałeś. Dzięki!
colinux
Obstawiam, że jest bardziej prawdopodobne, że jest to coś podobnego var url = omeObject['usuallyAURL'];, a to jest ustawiane jako src lub href jakiegoś żądanego zasobu, a zatem jest traktowane jako żądanie ścieżki względnej. tj.<img src="undefined" />
Yahel
17

Na podstawie tego posta dokonałem inżynierii wstecznej wtyczki / złośliwego oprogramowania „Complitly” do Chrome i stwierdziłem, że to rozszerzenie wprowadza ulepszoną funkcję autouzupełniania, która generuje „niezdefiniowane” żądania w każdej witrynie, w której pole tekstowe jest oznaczone jako NAME lub Identyfikator „wyszukiwania”, „q” i wiele innych.

Odkryłem również, że plik enable.js (jeden z kompletnych plików) sprawdzał zmienną globalną o nazwie „Suggestmeyes_loaded”, aby zobaczyć, czy jest już załadowana (jak Singleton). Zatem ustawienie tej zmiennej na false wyłącza wtyczkę.

Aby wyłączyć złośliwe oprogramowanie i zatrzymać „niezdefiniowane” żądania, zastosuj to do każdej strony z polem wyszukiwania w swojej witrynie:

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

To złośliwe oprogramowanie przekierowuje również użytkowników do witryny „searchcompletion.com”, czasami wyświetlając reklamy konkurencji. Dlatego należy to traktować poważnie.

Willy Barro
źródło
Widzę to również w moich dziennikach, na stronach, na których prawdopodobnie nie może to być JS; Uważam, że masz 100% racji. Chociaż zastanawiam się, ile czasu minie, zanim złośliwe oprogramowanie zmieni nazwę tej zmiennej.
Lawrence Dol
w moim przypadku brzmi całkiem wiarygodnie. jeden wyjątek: Żądany adres URL: / ForSale / beach_front_property / bronx / undefined / User Agent: Mozilla / 5.0 (kompatybilny; Googlebot / 2.1; + google.com/bot.html ) nie wiem, dlaczego Googlebot miałby to znaleźć i śledzić. chyba że wykryli gdzieś adres URL i poszli zobaczyć. ale bot podaje poprawny adres odsyłający
Chris Sattinger
inny wyjątek: Klient użytkownika: Opera / 9.80 (Windows NT 5.1) Presto / 2.12.388 Wersja / 12.16 Całkowicie nie jest dostępny dla Opery, także widzę dużo Linuksa, Androida i NT
Chris Sattinger
@felix Jedno miejsce, w którym Googlebot dowiaduje się o adresach URL, pochodzi od użytkowników Chrome, gdy przeglądarka „telefony do domu”
Izkata
8

Prawidłowo ustaliłeś, że undefinedproblem dotyczy JavaScript i jeśli użytkownicy Twojej witryny nie skarżyli się na wyświetlanie stron błędów, możesz sprawdzić następujące kwestie.

Jeśli do ustawiania lub zmiany lokalizacji obrazów używany jest JavaScript, czasami zdarza się, undefinedże do URI trafia.

Kiedy tak się stanie, przeglądarka z radością spróbuje załadować obraz (bez nagłówków AJAX), ale pozostawi wskazówki: ustawia określony Accept:nagłówek; zamiast text/html, text/xml, ...tego użyje image/jpeg, image/png, ....

Po potwierdzeniu takiego nagłówka ograniczyłeś problem tylko do obrazów. Znalezienie przyczyny zajmie jednak trochę czasu :)

Aktualizacja

Aby ułatwić debugowanie, możesz przesłonić $.fn.attr()i wywołać debuger, gdy coś jest przypisane do undefined. Coś takiego:

​(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));
Jacek
źródło
Masz rację, mogłem mieć przewagę dzięki nagłówkom. Kiedy jest to żądanie Chrome, nagłówki są (przepraszam za złe formatowanie w komentarzach) 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 [...] Ale w IE9 nagłówek Accept odwołuje się do obrazu: W Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 przyszłym tygodniu poświęcę trochę czasu na zbadanie strony obrazów. Dzięki!
colinux
@colinux Zaktualizowałem swoją odpowiedź, aby ułatwić Ci znalezienie problemu. Daj mi znać, jeśli będziesz miał problemy z zastosowaniem tego.
Ja͢ck
3

Kilka faktów, które zostały ustalone, szczególnie w tym wątku: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

dzieje się tak na stronach, które w ogóle nie zawierają javascript. dowodzi to, że nie jest to błąd programowania na stronie

użytkownik jest nieświadomy problemu i kontynuuje przeglądanie całkiem szczęśliwie.

dzieje się to kilka sekund po tym, jak osoba odwiedza stronę.

nie zdarza się to każdemu.

dzieje się na wielu przeglądarkach (Chrome, IE, Firefox, Mobile Safari, Opera)

dzieje się na wielu systemach operacyjnych (Linux, Android, NT)

dzieje się na wielu serwerach internetowych (IIS, Nginx, Apache)

W jednym przypadku Googlebot podążał za linkiem i twierdził, że ten sam odsyłający. Mogą po prostu próbować być sprytni, a przeglądarka przekazała to statkowi-matce, który następnie wysłał bota do zbadania.

Jestem dość przekonany co do propozycji, że jest to spowodowane wtyczkami. Całkowicie to jedno, ale to nie obsługuje Opery. Jest wielu innych.

Chociaż przeglądarki mobilne są sprzeczne z teorią wtyczek.

Administratorzy systemów zgłosili poważny spadek, dodając trochę javascript na stronie, aby oszukać Complitly, myśląc, że jest już zainicjowany.

Oto moje rozwiązanie dla nginx:

location ~ undefined/?$  {
  return 204;
}

Zwraca to „tak, w porządku, ale brak treści dla ciebie”.

Jeśli jesteś na website.com/some/page i (w jakiś sposób) przejdziesz do website.com/some/page/undefined, przeglądarka pokaże zmieniony adres URL, ale nawet nie przeładuje strony. Poprzednia strona pozostanie bez zmian w oknie.

Jeśli z jakiegoś powodu jest to coś, czego doświadczają użytkownicy, będą mieli czyste doświadczenie noop i nie będą przeszkadzać w tym, co robili.

Chris Sattinger
źródło
Twoje rozwiązanie zdecydowanie uchroniło mnie przed skutkami tego. Przeglądarka narzekała na zawartość mieszaną (ssl i zwykłą), teraz problem został rozwiązany, dziękuję.
Moritz,
2

To brzmi jak sytuacja wyścigu, w której zmienna nie jest poprawnie inicjalizowana przed użyciem. Biorąc pod uwagę, że zgodnie z Twoimi komentarzami nie jest to problem z AJAX, będzie kilka sposobów, aby to rozwiązać, wymienionych poniżej.

Podłącz rejestrator wyjątków JavaScript : pomoże ci to złapać prawie wszystkie przypadkowe wyjątki javascript w twoim dzienniku. W większości przypadków pojawiają się tutaj błędy programistyczne. Umieść to przed jakimikolwiek skryptami. Będziesz musiał przechwycić je na serwerze i wydrukować w swoich dziennikach w celu późniejszej analizy. To twoja pierwsza linia obrony. Oto przykład:

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

Wyszukaj window.location : dla każdej z tych instancji należy dodać rejestrowanie lub sprawdzić niezdefiniowane konkatacje / dopełniacze do pliku window.location. Na przykład:

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

lub nieco czystszy:

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
} 

Jeśli jesteś zainteresowany uzyskaniem stacktraces na tym etapie, spójrz na: https://github.com/eriwen/javascript-stacktrace

Chwyć wszystkie nieobsłużone, niezdefiniowane linki : Oprócz window.location Pozostały tylko same linki DOM. Trzecim krokiem jest sprawdzenie wszystkich niezawieszonych linków DOM pod kątem nieprawidłowego wzorca adresu URL (możesz to załączyć zaraz po zakończeniu ładowania jQuery, wcześniej lepiej):

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

Mam nadzieję, że to jest pomocne. Miłego debugowania.

Sztuka
źródło
1

Zastanawiam się, czy może to być problem z blokadą reklam. Kiedy przeszukuję dzienniki według adresu IP, okazuje się, że po każdym żądaniu określonego użytkownika do /folder/page.html następuje żądanie do / folder / undefined

Sean
źródło
Myślę, że jest to również związane z oprogramowaniem na kliencie. Opierając się na ostatnich dziennikach, dzieje się tak tylko w przypadku określonych adresów IP i wydaje się, że dzieje się to konsekwentnie również w przypadku tych adresów. Widzę BTRS123368 i AskTbORJ / 5.15.2.23037 w ciągu agenta użytkownika, może jest to związane z jednym z nich.
Jorrit Schippers
Otrzymałem więcej wyników: ktoś z FunWebProducts w kliencie użytkownika również żąda / nieokreślonych adresów URL.
Jorrit Schippers,
0

Nie wiem, czy to pomaga, ale moja witryna zastępuje jeden konkretny plik obrazu * .webp plikiem undefined po załadowaniu go w wielu przeglądarkach. Czy Twoja witryna obsługuje obrazy w sieci Web?

Joseph Coco
źródło
0

Miałem podobny problem (ale z /nullbłędami 404 w konsoli), który odpowiedź @ andrew-martinez pomogła mi rozwiązać.

Okazuje się, że użyłem imgtagów z pustym srcpolem:

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

Mój pomysł polegał na tym, aby uniemożliwić przeglądarce ładowanie obrazu podczas ładowania strony w celu ręcznego załadowania później, ustawiając atrybut src z atrybutu data-src za pomocą javascript (ładowanie z opóźnieniem). Ale w połączeniu z iDangerous Swiper ta metoda spowodowała błąd.

Iwazaru
źródło