Frame Buster Buster … je nutný kód buster

Řekněme, že nechcete, aby ostatní weby „rámovaly“ váš web v <iframe> :

<iframe src="http://example.org"></iframe>

Takže do všech svých stránek vložíte JavaScript proti rámování a vynechání rámců:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Vynikající! Nyní automaticky „vypadnete“ nebo vypadnete z jakéhokoli prvku iframe, který obsahuje. Až na jeden malý problém.

Jak se ukázalo, váš kód pro vynechání snímků může být vyřazen , jak je znázorněno zde:

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

Tento kód dělá následující:

  • zvyšuje počítadlo pokaždé, když se prohlížeč pokusí opustit aktuální stránku pomocí window.onbeforeunload obsluha události
  • nastaví časovač, který se spouští každou milisekundu přes setInterval() a pokud zjistí, že se počítadlo zvýšilo, změní aktuální umístění na server pod kontrolou útočníka
  • tento server zobrazí stránku se stavovým kódem HTTP 204 , což nezpůsobuje, že prohlížeč nikam naviguje

Moje otázka zní – a to je spíše puzzle JavaScript než skutečný problém — jak můžete porazit toho, kdo ničí rámy?

Měl jsem několik myšlenek, ale při testování nic nefungovalo:

  • pokus o vymazání onbeforeunload událost přes onbeforeunload = null neměl žádný účinek
  • přidání alert() zastavil proces, aby uživatel věděl, že se děje, ale nijak nezasahoval do kódu; kliknutím na tlačítko OK bude vyřazení pokračovat jako obvykle
  • Nenapadá mě žádný způsob, jak vymazat setInterval() časovač

Nejsem moc programátor v JavaScriptu, takže tady je moje výzva pro vás:ahoj vyhazovači, dokážete rozluštit toho vyhazovače?

Odpověď

Nejsem si jistý, jestli je to životaschopné nebo ne – ale pokud nemůžete rozbít rám, proč nezobrazit varování. Pokud například vaše stránka není „horní stránkou“, vytvořte metodu setInterval, která se pokusí přerušit rámec. Pokud ani po 3 nebo 4 pokusech vaše stránka stále není hlavní stránkou – vytvořte prvek div, který pokryje celou stránku (modální rámeček) se zprávou a odkazem jako…

Prohlížíte si tuto stránku v neautorizovaném okně – (Blah bla… potenciální bezpečnostní problém)

kliknutím na tento odkaz tento problém vyřešíte

Není to nejlepší, ale nevidím žádný způsob, jak by se z toho mohli dostat.