81 votes

"undefined" ajouté aléatoirement dans 1% des urls demandées sur mon site web depuis le 12 juin 2012

Depuis le 12 juin 2012 11:20 TU, je vois des erreurs très bizarres dans mes logs varnish/apache.

Parfois, lorsqu'un utilisateur a demandé une page, plusieurs secondes plus tard, je vois une demande similaire mais la chaîne de caractères après le dernier / dans l'url a été remplacée par "undefined".

Exemple : http://example.com/foo/bar déclenche un http://example.com/foo/undefined demande.

Bien sûr, ces pages "indéfinies" n'existent pas et ma page 404 est renvoyée à la place (qui est une page personnalisée avec une mise en page standard, pas une 404 apache classique).

  • Cela se produit avec n'importe quelle page (de la page d'accueil à la plus profonde).
  • avec différents navigateurs, (principalement Chrome 19, mais aussi firefox 3.5 à 12, IE 8/9...) mais seulement 1% du trafic.
  • Les headers envoyés par ces requêtes sont des headers classiques (et il n'y a pas de headers ajax).
  • Pour une ip donnée, cela semble se produire de manière aléatoire : parfois à la première page visitée, parfois sur une page aléatoire pendant la visite, parfois sur plusieurs pages pendant la visite...

Bien entendu, cela ressemble à un problème de javascript (j'utilise jquery 1.7.2 hébergé par google), mais Je n'ai absolument rien changé dans les js/html ou la configuration du serveur. depuis plusieurs jours et je n'ai jamais vu ce genre d'erreur auparavant. Et bien sûr, il n'y a pas de tels liens dans le html.

J'ai également remarqué quelques faits intéressants :

  • les requêtes indéfinies ne sont jamais trouvées comme referer d'autres pages, mais les "vraies" pages ont été utilisées comme referer pour la requête suivante de la même IP (l'utilisateur a la possibilité d'utiliser le menu classique sur la page 404)
  • Je n'ai vu aucune trace de ces pages dans Google Analytics, je suppose donc qu'aucun javascript n'a été exécuté (le tracker existe sur toutes les pages, y compris les 404).
  • Personne ne nous a contactés à ce sujet, même lorsque j'ai invoqué le problème dans les réseaux sociaux du site web.
  • la plupart des utilisateurs continuent la visite après que

Tous ces faits me font penser que le problème se produit silencieusement dans les navigateurs, probablement déclenché par un add-on bogué, un antivirus, une barre de navigation ou un soft constructeur merdique intégré dans les navigateurs mis à jour hier (mais je n'ai trouvé aucun add-on sorti hier pour chrome, firefox et IE).

Est-ce que quelqu'un ici a remarqué le même problème, ou a une explication plus complète ?

Merci d'avance

22voto

Andrew Martinez Points 2034

Il n'y a pas de réponse simple et directe.

Vous allez devoir déboguer ce problème. Il s'agit probablement de JavaScript, car l'URL contient le mot "undefined". Cependant, il ne s'agit pas forcément d'AJAX, mais de JavaScript créant n'importe quelle URL qui est automatiquement résolue par le navigateur (par exemple, JavaScript qui définit l'attribut src sur une balise image, définissant un attribut css-image, etc.) J'utilise Firefox con Firebug installé la plupart du temps, donc mes instructions seront en gardant cela à l'esprit.

Configuration initiale de Firebug

Sautez cette étape si vous savez déjà comment utiliser Firebug.

Après avoir installé et redémarré Firefox pour Firebug, vous allez devoir activer la plupart des "panneaux" de Firebug. Pour ouvrir Firebug, il y aura une petite chose ressemblant à un insecte de feu dans le coin supérieur droit de votre navigateur ou vous pouvez appuyer sur F12. Cliquez sur les onglets de Firebug 'Console', 'script', 'Net' et activez-les en les ouvrant et en lisant les informations du panneau. Vous devrez peut-être rafraîchir la page pour qu'ils fonctionnent correctement.

Débogage de l'interaction avec l'utilisateur

Naviguez vers l'une des pages qui pose problème avec Firebug ouvert et le panneau Net actif. Dans le panneau Net, il y a plusieurs options : Effacer, Persister, Tout, Html, etc. Assurez-vous que l'option "ALL" est sélectionnée. Ne faites rien sur la page et essayez de ne pas passer la souris sur quoi que ce soit. Regardez les requêtes. La demande pour l'URL invalide sera rouge et aura probablement un statut de 404 Not Found (ou similaire).

Vous le voyez en charge ? Passez à la partie suivante.

Vous ne le voyez pas au chargement initial ? Commencez à utiliser votre page et continuez ici.

Commencez à cliquer sur chaque élément, passez la souris sur tout, etc. Gardez les yeux sur le panneau Net et observez les demandes qui échouent. Vous devrez peut-être faire preuve de créativité, mais continuez à utiliser votre application jusqu'à ce que vous voyiez votre navigateur faire une requête invalide. Si la page fait beaucoup de demandes, n'hésitez pas à cliquer sur le bouton "Effacer" en haut à gauche du panneau "Net" pour la clarifier un peu.

Si vous soumettez la page et voyez qu'une demande échouée est envoyée très rapidement, mais qu'elle est ensuite perdue parce que la page suivante se charge, activez la persistance en cliquant sur "Persistance" en haut à gauche du panneau Net.

Lorsque ce sera le cas, et cela devrait l'être, réfléchissez à ce que vous avez fait pour que cela arrive. Voyez si vous pouvez faire en sorte que cela se reproduise. Après avoir déterminé quelle interaction avec l'utilisateur est à l'origine du problème, plongez dans le code et commencez à chercher les éléments qui font des requêtes invalides.

Vous pouvez utiliser l'onglet script pour définir des points d'arrêt dans votre JavaScript et les parcourir. Examinez les gestionnaires d'événements réalisés via $(elemment).bind/click/focus/etc ou à partir des attributs d'événements de la vieille école comme onclick=""/onfocus="" etc.

Si la demande se produit dès le chargement de la page

Cela va être un peu plus difficile à cerner. Vous devrez aller dans l'onglet script et commencer à ajouter des points d'arrêt à chaque script qui s'exécute au chargement. Vous faites cela en cliquant sur le côté gauche de la ligne de JavaScript.

Rechargez votre page et vos points d'arrêt devraient empêcher le navigateur de charger la page. Appuyez sur le bouton 'Continue' sur le panneau script. Allez dans votre panneau net et voyez si votre requête a été faite, continuez jusqu'à ce qu'elle soit trouvée. Vous pouvez utiliser cette méthode pour réduire l'origine de la demande en ajoutant lentement de plus en plus de points de rupture, puis en entrant et en sortant des fonctions.

Ce que vous recherchez dans votre code

Quelque chose qui ressemble à ce qui suit :

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

var url = workingUrl + someObject.someProperty;

Gardez à l'esprit que someObject peut être un objet {} un tableau [] ou tout autre type de navigateur interne. Le fait est que l'on accède à une propriété qui n'existe pas.

Je ne vois aucune demande 404/rouge.

Alors ce qui en est la cause n'est pas déclenché par vos tests. Essayez d'utiliser plus de choses. Le fait est que vous devriez être capable de faire en sorte que la requête se produise d'une manière ou d'une autre. Mais vous ne le savez pas encore. Elle doit apparaître dans le panneau Net. Le seul cas où elle ne s'affiche pas est lorsque vous ne faites pas ce qui la déclenche.

Conclusion

Il n'y a pas de moyen super facile de déterminer ce qui se passe exactement. Cependant, en utilisant les méthodes que j'ai décrites, vous devriez au moins être capable de vous en approcher. C'est probablement quelque chose que vous n'avez même pas envisagé.

17voto

Willy Barro Points 384

Sur cette base poste J'ai effectué une rétro-ingénierie du plugin/malware "Complitly" pour Chrome, et j'ai découvert que cette extension injecte une fonction de "complétion automatique améliorée" qui envoie des requêtes "non définies" à tous les sites qui ont un champ de texte d'entrée avec le NOM ou l'ID de "search", "q" et bien d'autres.

J'ai également découvert que le fichier enable.js (un des fichiers complitly) vérifiait une variable globale appelée "suggestmeyes_loaded" pour voir si elle était déjà chargée (comme un Singleton). Donc, en mettant cette variable à false, le plugin est désactivé.

Pour désactiver le logiciel malveillant et mettre fin aux requêtes "indéfinies", appliquez cette mesure à chaque page de votre site comportant un champ de recherche :

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

Ce malware redirige également vos utilisateurs vers un site "searchcompletion.com", affichant parfois des publicités de concurrents. Il faut donc le prendre au sérieux.

8voto

Jack Points 88446

Vous avez correctement établi que le undefined concerne un problème de JavaScript et si les utilisateurs de votre site ne se sont pas plaints de voir des pages d'erreur, vous pouvez vérifier les points suivants.

Si JavaScript est utilisé pour définir ou modifier l'emplacement des images, il arrive parfois qu'un message de type undefined fait son chemin dans l'URI.

Dans ce cas, le navigateur essaiera volontiers de charger l'image (pas d'en-têtes AJAX), mais il laissera des indices : il fixe une valeur particulière de Accept: au lieu de text/html, text/xml, ... il utilisera image/jpeg, image/png, ... .

Une fois qu'un tel en-tête est confirmé, vous avez réduit le problème aux seules images. Trouver la cause profonde du problème peut prendre un certain temps :)

Mise à jour

Pour faciliter le débogage, vous pouvez remplacer $.fn.attr() et invoquer le débogueur lorsque quelque chose est assigné à undefined. Quelque chose comme ça :

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

2voto

arturnt Points 2072

Cela ressemble à une condition de course où une variable n'est pas initialisée correctement avant d'être utilisée. Étant donné qu'il ne s'agit pas d'un problème AJAX selon vos commentaires, il y a plusieurs façons de résoudre ce problème, énumérées ci-dessous.

Accrocher un enregistreur d'exception Javascript Ceci vous aidera à attraper à peu près toutes les exceptions javascript aléatoires dans votre journal. La plupart du temps, les erreurs de programmation apparaîtront ici. Mettez-le avant tous les scripts. Vous devrez les attraper sur le serveur et les imprimer dans vos journaux pour les analyser plus tard. C'est votre première ligne de défense. Voici un exemple :

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

Recherche de window.location Pour chacun de ces cas, vous devez ajouter la journalisation ou la vérification des concats/appenders non définis à votre window.location. Par exemple :

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

ou le légèrement plus propre :

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 vous souhaitez obtenir des traces de pile à ce stade, consultez le site : https://github.com/eriwen/javascript-stacktrace

Récupérer tous les liens indéfinis non gérés : En plus de window.location La seule chose qui reste sont les liens DOM eux-mêmes. La troisième étape consiste à vérifier tous les liens DOM non manipulés pour votre motif d'URL invalide (vous pouvez attacher ceci juste après que jQuery ait fini de se charger, plus tôt c'est mieux) :

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

J'espère que cela vous sera utile. Bon débogage.

1voto

Sean Points 442

Je me demande si ce n'est pas un problème d'adblocker. Lorsque je consulte les journaux par adresse IP, il apparaît que chaque requête d'un utilisateur particulier vers /folder/page.html est suivie d'une requête vers /folder/undefined.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X