情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

Chromeで「このページでこれ以上ダイアログボックスを生成しない」が出ない「無限アラート」手法とその対策メモ

Chrome (67) JavaScript (13)

NHK「スマホの『消せないメッセージ』に注意」がどんなサイトなのか探してチェックしてみた」の記事を書く際に、無限アラートを表示するサイトの挙動について調べました。このとき、「Chromeなら無限alertでも、『このページでこれ以上ダイアログボックスを生成しない』が出るから大丈夫だろう」と高をくくっていたのですが、無限アラートが何度表示されても、一向に「このページでこれ以上ダイアログボックスを生成しない」が出てくれませんでした。閉じても閉じても同じメッセージが表示されて、止めることができません(別の方法で脱出できたけど)。ここで「一体どうして出なかったの?」と思って、そのサイトの無限アラートの実装方法を確認して、簡単な実験をしてみたので、実験結果を書いておきます。

無限アラート

JavaScriptを使用した無限アラートは、典型的な例だと、「for(;;){alert("無限アラート");}」のようなソースコードで、閉じても閉じてもアラート(alert)が無限に実行されるようになっています。

しかし、Chrome(PC版。スマホはどうなんだろう)では、このように無限ポップアップが表示されても、同じページで2回以上ポップアップが表示されたときに「このページでこれ以上ダイアログボックスを生成しない」というチェックボックスが表示されて、これにチェックを入れさえすれば、もう「alert」が実行されなくなる、という機能があるので、回避が簡単です。

chrome-inifinite-alert-block-sample

「このページでこれ以上ダイアログボックスを生成しない」が出ない無限アラート

と、思っていたのですが、「NHK「スマホの『消せないメッセージ』に注意」がどんなサイトなのか探してチェックしてみた」で紹介したサイトを調べていたときに遭遇した無限アラートでは、「このページでこれ以上ダイアログボックスを生成しない」が出ませんでした

実装内容

そんななぜか「これ以上生成しない」が出てくれない無限アラートがどんな実装になっているかを確認してみました。主要部分のソースコードはこうです。シンプルに抜き出してみました。

<html>
<script type="text/javascript">
var timer = setInterval("timerCallback()", 5000);
function timerCallback() {
        alert('無限アラート?(setInterval)');
}
</script>
</html>

つまるところ、「setInterval」を使って、「alert」を定期的に繰り返し実行しています。そんな複雑なことをしているわけではありません。

実験してみた

というのは実験結果から分かったことで、実際のサイトでは、もっといろいろなJavaScriptが書かれていて、どこのおかげで「このページでこれ以上ダイアログボックスを生成しない」が封じられているんだろう?、と最初は思いました。

しかし実験してみたところ、結局前述の「setIntervalを使う」というコードだけで、「このページでこれ以上ダイアログボックスを生成しない」が表示されない無限アラートが出来上がるとわかりました。

chrome-inifinite-alert-setinterval-sample

また、「for」を使った無限ループに置き換えた次の例で実験してみた場合は、ちゃんと「このページでこれ以上ダイアログボックスを生成しない」が表示されることを確認できました。

<html>
<script type="text/javascript">
for(;;) {
        alert("無限ループ?(for)");
}
</script>
</html>

chrome-inifinite-alert-for-sample

JavaScriptを簡単にオン・オフできるChrome拡張がおすすめ

こんなこともあるので、このような無限アラート対策として、JavaScriptをいざというときに無効化できるChrome拡張をインストールしておくことをおすすめします:「jsoff - Chrome ウェブストア

アドレスバーの隣に、JavaScriptのON/OFFボタンが追加される、シンプルなプラグインです。

コメント(0)

新しいコメントを投稿