Segurança - Stack Overflow com Pushstate nos navegadores

Hoje, 25/012016, li essa notícia onde mostra que um código ridicularmente simples pode travar seu navegador, se ele não for o Microsoft Edge por incrível que pareça.

O código em si é esse:

var total = '';  
for (var i=0; i<100000; i++) {  
  total += i.toString();
  history.pushState(0, 0, total);
}

Analisando esse código deduzimos o seguinte, na primeira iteração o valor adicionado ao pushState, para exemplificar entre no https://www.google.com.br/ e abre seu console e execute:

history.pushState(0, 0, "Suissera");  

Verá que a URL mudou para https://www.google.com.br/Suissera e a cada iteração eu coloco um novo valor que será concatenado ao final da URL do domínio em que nos encontramos.

Agora execute o seguinte código:

history.pushState(0, 0, "Webschool.io");  

E sua barra de endereço terá: https://www.google.com.br/Webscool.io.

A diferença é que depois de estar em https://www.google.com.br/Webscool.io e você clickar no botão de Voltar do navegador ele irá para: https://www.google.com.br/Suissera.

Agora imagine comigo um script que vai de 0 até 100.000 e que adicione cada iteração de valor, do 0 ao 100.000, nessa URL e a adicione no histórico, você deve pensar:

Mas claro que vai dar merda né!

Pois é mas não deveria pois a regra é clara!!

Os navegadores deveriam implementar essa regra corretamente:

In addition, a user agent could ignore calls to pushState() that are invoked on a timer, or from event listeners that are not triggered in response to a clear user action, or that are invoked in rapid succession.

fonte: https://html.spec.whatwg.org/multipage/browsers.html#dom-history-pushstate

Porém eu acredito que o Stack Overflow ocorra no Event Loop do Navegador que por não travar as chamadas de pushState entope o Stack navegador e já era amiguinho

Infelizmente minha análise é muito superficial e não sei onde acontece o overflow se no Event Loop ou no Cache do PushState já que cada navegador pode implementar sua política e eles podem deixar liberado até sua RAM aguentar (que beleza hein!).

https://gist.github.com/suissa/d280b5a7c7b6452bf912

Mas tio Suissa o que que eu farei com isso?

Uma resposta simples?

Não fará merda com o navegador do seu cliente, assim espero!

Comentários

comments powered by Disqus