11521 sujets

JavaScript, DOM et API Web HTML5

Bonsoir
J'essaie de déterminer en JS quele est le navigateur qui interprète le script. De façon étonnante, IE11 renvoie
userAgent"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko" 

Cela vous semble-t-il normal?
Modifié par PapyJP (08 Sep 2016 - 21:05)
Hello

Oui, c'est normal. Si tu fais le même test dans d'autres navigateurs, tu auras des résultats similaires. Chaque version de chaque navigateur s'identifie elle-même par sa chaine userAgent. Malheureusement, c'est (depuis longtemps) un bordel monstrueux...

Impossible donc de rechercher "Trident" pour vérifier qu'on est sous IE par exemple.

Le seul moyen que je vois pour solutionner ton problème, c'est de trouver les userAgent de toutes les versions d'IE et, dans ton code, de comparer celui du navigateur à celle-ci.

EDIT: j'ai trouvé un site recensant les chaines userAgent, dont celles d'IE : http://www.useragentstring.com/pages/useragentstring.php?name=Internet+Explorer
Modifié par Bguigui67 (08 Sep 2016 - 21:15)
C'est du grand n'importe quoi!!!
Ça s'apparente à de l'escroquerie.
Je découvre que IE n'affiche pas une police comme les autres navigateurs (gras trop empâté) je me dis que je vais structurer mon CSS en fonction du navigateur et je tombe sur ce m...dier!
Merci pour la liste, j'espère que je vais pouvoir en tirer quelque chose.
PapyJP a écrit :
Bonsoir
J'essaie de déterminer en JS quele est le navigateur qui interprète le script. De façon étonnante, IE11 renvoie
userAgent"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko" 

Cela vous semble-t-il normal?

Ne JAMAIS faire confiance à l'attribut HTTP "user-agent"... Celui-ci étant renseigné par l'émetteur de la requête, n'importe quoi peut avoir été mis comme valeur.
Sans virer parano, on peut même généraliser ce principe à tous les attributs HTTP, dont l'initialisation reste le fait de l'émetteur et qui en sus peuvent avoir été modifiés en cours de route (attaque de type "man in the middle", sauf erreur de ma part).
C'est ce qui rend difficile, voire impossible, une détection fiable du navigateur.
La seule façon de savoir quel est le moteur effectif du navigateur se situe côté client en testant en javascript la présence d'une fonction dont on sait qu'elle n'existe que sur ce moteur.
Microsoft ayant une propension naturelle à créer de nouvelles fonctions là où elles existent déjà, c'est un moyen de détecter qu'un IE quelconque sert d'environnement utilisateur.
Côté serveur, on est un peu plus démuni pour la détection.
À noter aussi que les entêtes HTTP renvoyées par un serveur peuvent également se révéler non fiables...
Je développe des servlets Java au boulot et ces servlets renseignent lesdites entêtes. Autant dire que je peux te retourner un "server-name" totalement bidon ou modifier toute autre valeur.
On se sert de ce principe notamment pour renvoyer un nom de serveur autre que celui effectivement utilisé. Celui qui essaie d'attaquer un serveur se présentant comme un IIS aura en fait affaire à un Tomcat. Cela ne protège pas de toute intrusion, les hackers de haut vol étant assez futés pour connaître ce principe, mais cela permet de gagner quelques requêtes HTTP pour la détection des essais de connexion anormaux et donne un peu de mou pour réagir vite.
L'histoire des user agent a été assez mouvementée. C'est pour ça que tous les browsers signent mozilla, que pratiquement tous prétendent être like geko, que chrome et quelques autres affirment aussi être like safari, et j'en passe...

a écrit :
Je découvre que IE n'affiche pas une police comme les autres navigateurs (gras trop empâté) je me dis que je vais structurer mon CSS en fonction du navigateur et je tombe sur ce m...dier!


De toute façon, à moins que ce soit une absolue nécessité et qu'il n'y ait vraiment pas d'autre solution, ce n'est pas une bonne idée de détecter le navigateur utilisé pour servir un contenu différent. ET ce n'est pas une mauvaise idée uniquement parce que l'user-agent est difficile à parser et change potentiellement souvent.

En premier lieu il faut plutôt essayer de détecter le support de la fonctionnalité visée. ET ensuite si, et seulement si, on n'a pas de moyen fiable pour cela, alors se baser sur le navigateur et sa version.