Sé que puede detectar el navegador con navigator.userAgent, pero ¿cómo puedo detectar el verdadero núcleo del navegador que alguien está usando JavaScript para evitar la suplantación de identidad, como se muestra aquí ?
No pude resolverlo buscándolo, siguió intentando mostrar cómo usar navigator.userAgent en su lugar.
Esta publicación de Reddit afirma que lo hace mediante la prueba de la funcionalidad del navegador, que es la forma en que evita el agente de usuario. ¡Vamos a profundizar en la fuente!
Lamentablemente, está bastante bien ofuscado. Lo intentaré independientemente. Una búsqueda rápida de "núcleo del navegador" produce este div:
<div id="psanh" class="azylh"> <div id="vvwzm" class="tlgfj">True Browser Core:</div> <div class="awysa">Unknown</div> <div id="ntnfh" class="uaujg">Chrome</div> <div class="xnzgd"> i <span class="zcgki"> Supports detecting true browser core even if the browser is spoofed, for:<br /> Firefox, Chrome, Edge, Internet Explorer, Safari, Opera, Konqueror. </span> </div> </div>
Podemos usar eso. Veamos dónde pusieron ntnfh
.
Es una línea que dice (ID("ntnfh").innerHTML = "" !== m ? m : n);
*. Eso significa establecer ntnfh en m
si m
no es una cadena vacía. Veamos cuánto es m
. Anteriormente, tenemos var m = "";
seguido de algo útil:
var m = ""; try { "" === m && "undefined" != typeof InstallTrigger && (m = "Firefox"); } catch (e) {} try { "" === m && g.chrome && (g.chrome.webstore || g.chrome.runtime) && (m = "Chrome"); } catch (e) {} try { "" === m && M.documentMode && (m = "Internet Explorer"); } catch (e) {} try { "" === m && "Internet Explorer" !== m && g.StyleMedia && (m = "Edge"); } catch (e) {} try { "" !== m || (!/constructor/i.test(g.HTMLElement) && "[object SafariRemoteNotification]" !== (!window.safari || safari.pushNotification).toString()) || (m = "Safari"); } catch (e) {} try { "" === m && ((g.opr && opr.addons) || g.opera) && (m = "Opera"); } catch (e) {}
Eso es difícil de leer. Pero la esencia de esto es que probamos cosas exclusivas del navegador. Por ejemplo, en Chrome, podemos verificar la tienda web y el tiempo de ejecución de Chrome. Tenga en cuenta que && (m = "Chrome")
establece m
en "Chrome"
. Es una manera bastante fea de escribirlo. Pero básicamente dice que si las cosas anteriores en esa línea son verdaderas, entonces configure m
en Chrome
. Es una forma fea de escribirlo, pero funciona debido a la evaluación de izquierda a derecha y al hecho de que un and
tiene que evaluar todo para asegurarse de que el resultado sea verdadero (es decir, si es falso, devolverá falso antes , sin llegar nunca a la tarea).
Pero la esencia es verificar las propiedades específicas del navegador y establecer la variable m
(el True Browser Core) en el navegador adivinado en función de las propiedades.
*He ejecutado la página a través de un formateador de código ( prettier
) para que sea más fácil de leer