"Indefinido" agregado aleatoriamente en el 1% de las URL solicitadas en mi sitio web desde el 12 de junio de 2012


80

Desde el 12 de junio de 2012 a las 11:20 TU, veo errores muy extraños en mis registros de barniz / apache.

A veces, cuando un usuario ha solicitado una página, varios segundos después veo una solicitud similar, pero la cadena all después de la última / en la URL ha sido reemplazada por "indefinida".

Ejemplo: http://example.com/foo/bar activa una solicitud http://example.com/foo/undefined .

Por supuesto, estas páginas "no definidas" no existen y mi página 404 se devuelve en su lugar (que es una página personalizada con un diseño estándar, no un apache 404 clásico)

  • Esto sucede con cualquier página (desde la página de inicio hasta la más profunda)
  • con varios navegadores, (principalmente Chrome 19, pero también Firefox 3.5 a 12, IE 8/9 ...) pero solo el 1% del tráfico.
  • Los encabezados enviados por estas solicitudes son encabezados clásicos (y no hay encabezados ajax).
  • Para una IP determinada, esto parece ocurrir al azar: a veces en la primera página visitada, a veces en una página aleatoria durante la visita, a veces varias páginas durante la visita ...

Por supuesto, parece un problema de javascript (estoy usando jquery 1.7.2 alojado por google), pero no he cambiado absolutamente nada en js / html o en la configuración del servidor desde hace varios días y nunca vi este tipo de error antes . Y, por supuesto, no existen tales enlaces en el html.

También noté algunos hechos interesantes:

  • las solicitudes no definidas nunca se encuentran como referente de otras páginas, sino que las páginas "reales" se usaron como referente para la siguiente solicitud de la misma IP (el usuario tiene la capacidad de usar el menú clásico en la página 404)
  • No vi ningún rastro de estas páginas en Google Analytics, por lo que supongo que no se ha ejecutado JavaScript (el rastreador existe en todas las páginas, incluida la 404)
  • nadie nos ha contactado sobre esto, aun cuando invoqué el problema en las redes sociales del sitio web
  • la mayoría de los usuarios continúan la visita después de eso

Todos estos hechos me hacen pensar que el problema ocurre silenciosamente en los navegadores, probablemente provocado por un complemento con errores, antivirus, una barra del navegador o un fabricante de mierda integrado en los navegadores actualizados ayer (pero no encontré ningún complemento lanzado ayer para Chrome, Firefox e IE).

¿Alguien aquí ha notado el mismo problema o tiene una explicación más completa?


2
Algún código JavaScript en sus páginas está construyendo URL y tiene uno o más errores. El software, sin modificarse, puede cambiar el comportamiento debido a actualizaciones del navegador, sensibilidad a la fecha / hora, cambios en la tercera parte del script, etc. Sin ver el código, será imposible saber exactamente qué está mal.
Puntiagudo

3
Solo un consejo / idea para la depuración: - Coloque un mensaje claro en su página 404 que diga en letras bastante grandes "Si ve esto, podría contactar x @ yz describiendo cómo llegó aquí" (posiblemente solo se muestra si location.href.search("undefined")es cierto). - Si no hay correos electrónicos y usa jquery ajax en todas partes, envuelva la llamada de jquery ajax en una función personalizada que primero verifique si los datos devueltos son un JSON y si data.undefinedError existe y, si existe, regístrelo en algún lugar (+ cree un cheque en su 404 que devuelve {undefinedError:true}si hay undefineden la url).
David Mulder

3
Yo también estoy experimentando esto y tampoco creo que sea un bot. Tanto / cache / xxxx como / undefined Sin embargo, no es solo Chrome 19, sino también IE 8 y 9.

3
También he tenido errores de {dominio} / indefinidos desde el 12 de junio. Intenté eliminar TODO javascript de mi sitio (google analytics, adsense, etc.), pero aún aparecen errores. Cada día aumenta el número de ellos. Casi todos los errores son generados por usuarios que utilizan Chrome de diferentes versiones. Sospecho que se trata de algunas extensiones o complementos, pero no puedo reproducirlo en mi propia PC. También mencioné que la solicitud que contiene / indefinido siempre se sigue después de la solicitud de página correcta con todas las subpeticiones (imágenes, css, etc.)
Almas

3
Otro informe, también que comenzó el 12 de junio: productforums.google.com/forum/#!topic/chrome/G1snYHaHSOc
Dogweather

Respuestas:


21

No hay una respuesta sencilla y directa.

Tendrá que depurar esto y probablemente sea JavaScript debido a la palabra 'indefinida' en la URL. Sin embargo, no tiene que ser AJAX, podría ser JavaScript creando cualquier URL que sea resuelta automáticamente por el navegador (por ejemplo, JavaScript que establece el atributo src en una etiqueta de imagen, configura un atributo css-image, etc.). Utilizo Firefox con Firebug instalado la mayor parte del tiempo, por lo que mis instrucciones serán teniendo eso en cuenta.

Configuración inicial de Firebug

Omita esto si ya sabe cómo usar Firebug.

Después de la instalación y reiniciar Firefox para Firebug, tendrás que habilitar la mayoría de los 'paneles' de Firebug. Para abrir Firebug, habrá una pequeña cosa con apariencia de insecto / bicho de fuego en la esquina superior derecha de su navegador o puede presionar F12. Haga clic en las pestañas de Firebug 'Consola', 'Script', 'Net' y habilítelas abriéndolas y leyendo la información del panel. Es posible que deba actualizar la página para que funcionen correctamente.

Depurar la interacción del usuario

Navega a una de las páginas que tiene el problema con Firebug abierto y el panel Net activo. En el panel de red habrá algunas opciones: 'Borrar', 'Persistir', 'Todo', 'Html', etc. Asegúrese de que TODO esté seleccionado. No hagas nada en la página y trata de no pasar el mouse sobre nada en ella. Revise las solicitudes. La solicitud de la URL no válida aparecerá en rojo y probablemente tendrá un estado de 404 No encontrado (o similar).

¿Lo ves en carga? Pase a la siguiente parte.

¿No lo ve en la carga inicial? Comience a usar su página y continúe aquí.

Empiece a hacer clic en cada función, pase el ratón sobre todo, etc. Mantenga los ojos en el panel de red y observe si las solicitudes fallan. Puede que tenga que ser creativo, pero continúe usando su aplicación hasta que vea que su navegador hace una solicitud no válida. Si la página realiza muchas solicitudes, siéntase libre de presionar el botón 'Borrar' en la parte superior izquierda del panel de Red para aclararlo un poco.

Si envía la página y ve una solicitud fallida que sale muy rápido pero luego la pierde porque se carga la página siguiente, habilite la persistencia haciendo clic en 'Persistir' en la parte superior izquierda del panel de red.

Una vez que lo haga, y debería, considere lo que hizo para que eso sucediera. Vea si puede hacer que vuelva a suceder. Después de averiguar qué interacción del usuario está haciendo que suceda, sumérjase en ese código y comience a buscar cosas que estén realizando solicitudes no válidas.

Puede usar la pestaña Script para configurar puntos de interrupción en su JavaScript y recorrerlos. Investigue los controladores de eventos realizados a través de $ (elemment) .bind / click / focus / etc o de los atributos de eventos de la vieja escuela como onclick = "" / onfocus = "" etc.

Si la solicitud se produce tan pronto como se carga la página

Esto va a ser un poco más difícil de fijar. Deberá ir a la pestaña Script y comenzar a agregar puntos de interrupción a cada script que se ejecuta en carga. Haz esto haciendo clic en el lado izquierdo de la línea de JavaScript.

Vuelva a cargar su página y sus puntos de interrupción deberían evitar que el navegador cargue la página. Presione el botón 'Continuar' en el panel de secuencia de comandos. Vaya a su panel de red y vea si su solicitud fue realizada, continúe hasta que la encuentre. Puede usar esto para reducir el lugar desde el que se realiza la solicitud agregando lentamente más y más puntos de interrupción y luego entrando y saliendo de funciones.

Lo que buscas en tu código

Algo que sea similar a lo siguiente:

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

var url = workingUrl + someObject.someProperty;

Tenga en cuenta que someObject puede ser un objeto {}, una matriz []o cualquiera de los tipos de navegadores internos. El caso es que se accederá a una propiedad que no existe.

No veo ninguna solicitud 404 / roja

Entonces, lo que sea que lo esté causando, sus pruebas no lo activan. Intente usar más cosas. El punto es que debería poder hacer que la solicitud suceda de alguna manera. Simplemente no lo sabes todavía. Tiene que aparecer en el panel Net. La única vez que no lo hará es cuando no está haciendo lo que lo desencadena.

Conclusión

No existe una manera muy fácil de determinar qué está sucediendo exactamente. Sin embargo, utilizando los métodos que describí, al menos debería poder acercarse. Probablemente sea algo que ni siquiera estás considerando.


1
Gracias por su respuesta. Ya intenté inspeccionar esto con firebug y viendo mis registros de barniz / apache en mi ip, sin éxito. Estas solicitudes "indefinidas" representan menos del 1% de todas las solicitudes html y se trata de todo tipo de páginas, por lo que es muy difícil activarlas. Pero la semana que viene lo intentaré de nuevo, con diferentes navegadores e investigaré más profundamente los controladores de eventos como dijiste. ¡Gracias!
colinux

Apuesto a que es más probable que sea algo así como var url = omeObject['usuallyAURL'];, y que se establezca como src o href de algún activo solicitado y, por lo tanto, se trate como una solicitud de ruta relativa. es decir,<img src="undefined" />
Yahel

17

Según esta publicación , realicé ingeniería inversa del complemento / malware de Chrome "Complitly" y descubrí que esta extensión está inyectando una función de "autocompletado mejorado" que arrojaba solicitudes "indefinidas" en cada sitio que tiene un campo de texto de entrada con NAME o ID de "búsqueda", "q" y muchos otros.

También encontré que el archivo enable.js (uno de los archivos complitly) estaba comprobando una variable global llamada "Sugieremeyes_cargado" para ver si ya está cargado (como un Singleton). Por lo tanto, establecer esta variable en falso deshabilita el complemento.

Para deshabilitar el malware y detener las solicitudes "indefinidas", aplique esto a cada página con un campo de búsqueda en su sitio:

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

Este malware también redirige a sus usuarios a un sitio "searchcompletion.com", que a veces muestra anuncios de la competencia. Por lo tanto, debe tomarse en serio.


También veo esto en mis registros, con páginas donde posiblemente no puede ser JS; Creo que estás 100% correcto. Aunque me pregunto cuánto tiempo pasará antes de que el malware cambie el nombre de esta variable.
Lawrence Dol

suena bastante plausible en mi caso. una excepción: URL solicitada: / ForSale / beach_front_property / bronx / undefined / User agent: Mozilla / 5.0 (compatible; Googlebot / 2.1; + google.com/bot.html ) No estoy seguro de por qué el robot de Google lo encontraría y lo seguiría. a menos que detecten la URL en algún lugar y vayan a echar un vistazo. pero el bot indica una URL de referencia correcta
Chris Sattinger

otra excepción: Agente de usuario: Opera / 9.80 (Windows NT 5.1) Presto / 2.12.388 Versión / 12.16 Complitly no está disponible para Opera también veo mucho Linux, Android y NT
Chris Sattinger

@felix Un lugar donde Googlebot aprende acerca de las URL es a través de los usuarios de Chrome cuando el navegador "llama a casa"
Izkata

8

Ha establecido correctamente que se undefinedrelaciona con un problema de JavaScript y si los usuarios de su sitio no se han quejado de ver páginas de error, puede verificar lo siguiente.

Si se usa JavaScript para establecer o cambiar las ubicaciones de las imágenes, a veces sucede que se undefinedabre camino en el URI.

Cuando eso suceda, el navegador intentará felizmente cargar la imagen (sin encabezados AJAX), pero dejará pistas: establece un Accept:encabezado particular ; en lugar de text/html, text/xml, ...usarlo image/jpeg, image/png, ....

Una vez que se confirma dicho encabezado, se ha reducido el problema a imágenes únicamente. Sin embargo, encontrar la causa raíz posiblemente llevará algún tiempo :)

Actualizar

Para ayudar con la depuración, puede anular $.fn.attr()e invocar al depurador cuando se asigna algo a undefined. Algo como esto:

​(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));

Tienes razón, podría tener una ventaja gracias a los encabezados. Cuando se trata de una solicitud de Chrome, los encabezados son (perdón por el mal formato en los comentarios). 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 [...] Pero con IE9, aceptar referencias de encabezado a una imagen: la Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 próxima semana me tomaré un tiempo para investigar el lado de las imágenes. ¡Gracias!
colinux

@colinux He actualizado mi respuesta para ayudarlo a encontrar el problema más fácilmente. Avísame si tienes algún problema para aplicarlo.
Ja͢ck

3

Algunos hechos que se han establecido, especialmente en este hilo: http://productforums.google.com/forum/#!msg/chrome/G1snYHaHSOc/p8RLCohxz2kJ

sucede en páginas que no tienen javascript en absoluto. esto prueba que no es un error de programación en la página

el usuario no es consciente del problema y continúa navegando con bastante alegría.

sucede unos segundos después de que la persona visita la página.

no le pasa a todo el mundo.

ocurre en varios navegadores (Chrome, IE, Firefox, Mobile Safari, Opera)

ocurre en múltiples sistemas operativos (Linux, Android, NT)

ocurre en múltiples servidores web (IIS, Nginx, Apache)

Tengo un caso de googlebot siguiendo el enlace y reclamando la misma referencia. Es posible que solo estén tratando de ser inteligentes y el navegador se lo comunicó a la nave nodriza, quien luego estableció un bot para investigar.

Estoy bastante convencido por la propuesta de que es causado por complementos. Complitly es uno, pero eso no es compatible con Opera. Hay muchos otros.

Aunque los navegadores móviles pesan en contra de la teoría de los complementos.

Los administradores de sistemas han informado de una caída importante al agregar algo de javascript en la página para engañar a Complitly para que piense que ya está inicializado.

Aquí está mi solución para nginx:

location ~ undefined/?$  {
  return 204;
}

Esto devuelve "sí, está bien, pero no hay contenido para ti".

Si está en website.com/some/page y (de alguna manera) navega a website.com/some/page/undefined, el navegador mostrará la URL modificada, pero ni siquiera volverá a cargar la página. La página anterior permanecerá como estaba en la ventana.

Si por alguna razón esto es algo que los usuarios experimentan, entonces tendrán una experiencia noop limpia y no perturbará lo que estén haciendo.


Tu solución definitivamente me salvó de las consecuencias de esto. El navegador se quejaba de contenido mixto (ssl y simple), ahora esto está resuelto, gracias.
Moritz

2

Esto suena como una condición de carrera en la que una variable no se inicializa correctamente antes de ser utilizada. Teniendo en cuenta que este no es un problema de AJAX según sus comentarios, habrá un par de formas de resolverlo, que se enumeran a continuación.

Conecta un registrador de excepciones de Javascript : esto te ayudará a detectar casi todas las excepciones de JavaScript aleatorias en tu registro. La mayoría de las veces, aparecerán errores de programación aquí. Ponlo antes de cualquier guión. Deberá capturarlos en el servidor e imprimirlos en sus registros para analizarlos más tarde. Esta es tu primera línea de defensa. Aquí hay un ejemplo:

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

Busque window.location : para cada una de estas instancias, debe agregar registro o verificar concats / anexos no definidos en su window.location. Por ejemplo:

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

o el ligeramente más limpio:

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
} 

Si está interesado en obtener trazas de pila en esta etapa, eche un vistazo a: https://github.com/eriwen/javascript-stacktrace

Coge todos los enlaces indefinidos no gestionados : además de window.location Lo único que queda son los enlaces DOM. El tercer paso es verificar todos los enlaces DOM sin control para su patrón de URL no válido (puede adjuntar esto justo después de que jQuery termine de cargarse, antes mejor):

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

Espero que esto sea útil. Feliz depuración.


1

Me pregunto si esto podría ser un problema de bloqueador de anuncios. Cuando busco en los registros por dirección IP, parece que cada solicitud de un usuario en particular a /folder/page.html va seguida de una solicitud a / folder / undefined


Creo que esto también está relacionado con el software del cliente. Según los registros recientes, esto solo ocurre para direcciones IP específicas y parece suceder de manera consistente para esas también. Veo BTRS123368 y AskTbORJ / 5.15.2.23037 en la cadena del agente de usuario, tal vez esté relacionado con uno de esos.
Jorrit Schippers

Obtuve algunos resultados más: alguien con FunWebProducts en el agente de usuario también está solicitando URL no definidas.
Jorrit Schippers

0

No sé si esto ayuda, pero mi sitio web está reemplazando un archivo de imagen * .webp en particular por indefinido después de que se carga en varios navegadores. ¿Su sitio aloja imágenes webp?


0

Tuve un problema similar (pero con /nullerrores 404 en la consola) que la respuesta de @ andrew-martinez me ayudó a resolver.

Resulta que estaba usando imgetiquetas con un srccampo vacío :

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

Mi idea era evitar que el navegador cargara la imagen al cargar la página para cargarla manualmente más tarde configurando el atributo src del atributo data-src con javascript (carga diferida). Pero cuando se combina con iDangerous Swiper, ese método causó el error.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.