Qué resultados obtienes al ejecutar este código?

Iniciado por @XSStringManolo, 4 Octubre 2019, 12:17 PM

0 Miembros y 2 Visitantes están viendo este tema.

@XSStringManolo

Estaba pensando en nuevos métodos de device fingerprinting y se me ocurrió saturar el stack de llamadas.

1)Cual es el número más grande que se te muestra al final del documento?

2)Se muestra el mismo número en distintos navegadores?

3)Siempre se repite el mismo resultado de forma consistente en el mismo navegador?

Código (javascript) [Seleccionar]
<html>
<body>
/*Pon etiqueta script*/

var i =0;
stack();

function stack()
{
++i;
document.write(i+" ");
return overflow();
}

function overflow()
{
return stack();
}
/*Pon etiqueta /script */
</body>
</html>


A ver que resultados obtiene cada uno.
Yo con Android con un smartphone gama baja en Samsung Browser obtengo 10505 iteraciones hasta que se llena el stack.

No tengo ahora mismo más dispositivos disponibles. A ver que resultados obteneis vosotros y si podemos sacar conclusiones en base a ellos de si es un método que pueda ser útil para hacer fingerprint.

WHK

Normalmente ese script es dificil que sea ejecutado en navegadores modernos primeramente porque javascript es estrictamente lineal en ordenes de instrucciones, por ejemplo, en la segunda línea de código donde ejecutas stack() debería arrojar una excepción debido a que este aun no está definido, a demás los navegadores como google chrome y mozilla firefox detectan ese desbordamiento de pila.

Va a depender de la capacidad de hardware de cada dispositivo en el hipotético caso de que si logre ser ejecutado y evada cualquier mecanismo heurístico, el problema no se encuentra en el valor autoincrementado de i, sino de la pila de llamadas recursivas entre la función stack() y callback() ya que ninguna finaliza al ser llamada por la otra ya que no es una ejecución asíncrona provocando un desbordamiento de pila. Esto es muy común que suceda en otros lenguajes pero es controlado por el heap size o el paralelismo en el caso de Java y Python.

En algunos navegadores simplemente no podrás ejecutar nada después de esta función y todo script se detendría asi que tampoco podrás comprobar el resultado de tu test a menos que exista una interacción manual por parte del usuario como el envío del contador en un form pero habría que hacer colapsar su pestaña en uso de recursos.

Hay maneras mucho mas efectivas para saber que navegador está utilizando el usuario jajajaja y no hablo de su user agent por cabeceras del request sino a traves de librerías y el mismo estandar de javascript:

https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser
https://developer.mozilla.org/en-US/docs/Web/API/Window/navigator

Saludos.

@XSStringManolo

Cita de: WHK en  4 Octubre 2019, 12:54 PM
Normalmente ese script es dificil que sea ejecutado en navegadores modernos primeramente porque javascript es estrictamente lineal en ordenes de instrucciones, por ejemplo, en la segunda línea de código donde ejecutas stack() debería arrojar una excepción debido a que este aun no está definido, a demás los navegadores como google chrome y mozilla firefox detectan ese desbordamiento de pila.

Va a depender de la capacidad de hardware de cada dispositivo en el hipotético caso de que si logre ser ejecutado y evada cualquier mecanismo heurístico, el problema no se encuentra en el valor autoincrementado de i, sino de la pila de llamadas recursivas entre la función stack() y callback() ya que ninguna finaliza al ser llamada por la otra ya que no es una ejecución asíncrona provocando un desbordamiento de pila. Esto es muy común que suceda en otros lenguajes pero es controlado por el heap size o el paralelismo en el caso de Java y Python.

En algunos navegadores simplemente no podrás ejecutar nada después de esta función y todo script se detendría asi que tampoco podrás comprobar el resultado de tu test a menos que exista una interacción manual por parte del usuario como el envío del contador en un form pero habría que hacer colapsar su pestaña en uso de recursos.

Hay maneras mucho mas efectivas para saber que navegador está utilizando el usuario jajajaja y no hablo de su user agent por cabeceras del request sino a traves de librerías y el mismo estandar de javascript:

https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser
https://developer.mozilla.org/en-US/docs/Web/API/Window/navigator

Saludos.
En javascript si se pueden declarar variables y funciones después de utilizarlas.
Cita de: Eloquent javascript
3rd edition Marijn Haverbeke
Código (javascript) [Seleccionar]
console.log("The future says:", future());
function future() {
return "You'll never have flying cars";
}

The preceding code works, even though the function is defined below the code
that uses it. Function declarations are not part of the regular top-to-bottom
flow of control. They are conceptually moved to the top of their scope and can
be used by all the code in that scope. This is sometimes useful because it offers
the freedom to order code in a way that seems meaningful, without worrying
about having to define all functions before they are used.

Por lo que leí y como comentas algunos navegadores muestran valores. Mientras no se llena el stack el código funciona, asique puedo enviar los valores de i a PHP.

Es más por curiosidad de si funcionaría y como.

MinusFour

Cita de: WHK en  4 Octubre 2019, 12:54 PM
Normalmente ese script es dificil que sea ejecutado en navegadores modernos primeramente porque javascript es estrictamente lineal en ordenes de instrucciones, por ejemplo, en la segunda línea de código donde ejecutas stack() debería arrojar una excepción debido a que este aun no está definido, a demás los navegadores como google chrome y mozilla firefox detectan ese desbordamiento de pila.

javascript hace hoisting de las declaraciones de las funciones.

Código (javascript) [Seleccionar]

hola();
function hola(){ console.log('hola'); }


Lo que hace el runtime de javascript es lo mismo que si haces:

Código (javascript) [Seleccionar]

function hola(){ console.log('hola'); }
hola();


Incluso dentro de funciones, esto funciona:

Código (javascript) [Seleccionar]

(function(){
    hola();
    function hola(){ console.log('hola'); }
}());


O en cualquier cuerpo de bloques ({}) también. Es el mismo comportamiento con variables var:

Código (javascript) [Seleccionar]

'use strict';
test = 'hola';
var test;


Donde no hay hoisting es con cosas como let, const y class.

No necesitas estar usando document.write en cada loop...

Código (javascript) [Seleccionar]

var i=0;
try { stack(); } catch(e){ document.write(i); };

function stack()
{
++i;
return overflow();
}

function overflow()
{
return stack();
}


Eso si el navegador lo maneja como un error normal.

animanegra

En mi caso, cambia cada vez, no devuelve algo consistente. Habría que mirar si en media...

try{stack();}catch(e){console.log(i);}
196419 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
397489 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
598559 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
799629 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
1000699 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
1201769 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
1402839 debugger eval code:1:31
undefined

Saludos

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

MinusFour

Cita de: animanegra en  4 Octubre 2019, 16:43 PM
En mi caso, cambia cada vez, no devuelve algo consistente. Habría que mirar si en media...

try{stack();}catch(e){console.log(i);}
196419 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
397489 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
598559 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
799629 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
1000699 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
1201769 debugger eval code:1:31
undefined
try{stack();}catch(e){console.log(i);}
1402839 debugger eval code:1:31
undefined

Saludos

Bueno, la variable obviamente se incrementa una y otra vez si no la localizas, necesitas restablecer i a 0. En mi chrome el valor es constante. En Firefox, el valor cambia un poco.

Código (javascript) [Seleccionar]

{
  var i = 0;
  try { (function stack(){ i++; stack();})(); } catch(e) { console.log(i); }
}

@XSStringManolo

Samsung browser está basado en chromium. Es muy pronto para decirlo pero la tendencia parece que en navegadores con chromium el espacio para el stack es fijo? Y en mozilla una aproximación?

Son interesantes los resultados.

EdePC

Saludos,

Código (javascript) [Seleccionar]
<html>
 <body>
   <‌‌scr‌‌ipt>
     var i = 0;
     stack();
     function stack() {
       ++i;
       document.write(i + " ");
       return overflow();
     }
     function overflow() {
       return stack();
     }
   </scr‌‌ipt>
 </body>
</html>


CitarGoogle Chrome 76.0.3809.100 (Build oficial) (64 bits)

Uncaught RangeError: Maximum call stack size exceeded
   at overflow (strman.html:11)
   at stack (strman.html:9)
   at overflow (strman.html:12)
   at stack (strman.html:9)
   at overflow (strman.html:12)
   at stack (strman.html:9)
   at overflow (strman.html:12)
   at stack (strman.html:9)
   at overflow (strman.html:12)
   at stack (strman.html:9)

- Mínimo número: 1
- Máximo número: 6985
- Valor de incremento constante: +1

@XSStringManolo

Cita de: EdePC en  4 Octubre 2019, 17:36 PM
Saludos,

Código (javascript) [Seleccionar]
<html>
 <body>
   <‌‌scr‌‌ipt>
     var i = 0;
     stack();
     function stack() {
       ++i;
       document.write(i + " ");
       return overflow();
     }
     function overflow() {
       return stack();
     }
   </scr‌‌ipt>
 </body>
</html>


- Mínimo número: 1
- Máximo número: 6985
- Valor de incremento constante: +1
Qué hardware utilizaste?

EdePC

Máx.: 6985
https://www.pccomponentes.com/lenovo-y50-70-intel-core-i7-4700hq-12gb-1tb-gtx860m-15-6-

---

- Ahora lo he probado en otro PC, este es un:

Google Chrome   76.0.3809.100 (Build oficial) (64 bits) (cohort: Stable)
Procesador: https://ark.intel.com/content/www/es/es/ark/products/80817/intel-core-i5-4460-processor-6m-cache-up-to-3-40-ghz.html
MotherBoard: https://www.gigabyte.com/Motherboard/GA-Z97P-D3-rev-11#ov
Ram: 4 + 4 GB DDR3 a 1333MHz

-- Los resultados fueron idénticos a los anteriores excepto que el Máx. subió un punto :xD:

Máx.: 6986