4
1

More than 3 years have passed since last update.

Yahooニュースに無限ループを見つけた

Last updated at Posted at 2020-02-29

更新情報

2020年7月23日に確認したらYahooニュースの非同期無限ループはなくなっていました。


Yahooニュースの非同期無限ループ

見つけたYahooニュースの非同期無限ループはsetInterval(checkPosition, 100)
どのニュースでもHTMLの<script>に見つかる。
0.1秒ごとではあるがプログラムコードが無限に実行される。
やむをえずsetIntervalを使用するにしてもこの用途では1秒以上がいい。

<script type="text/javascript">
(function() {
    // checkPositionセット
    $(window).load(function() {
        // windowsだと計算が遅いため、scrollイベントのみだと右カラムがフッターに被ることがあるため、setIntervalにて常時再計算
        // スクロール、リサイズ時に即時にポジション確認するためにイベント取得
        $(window).on('scroll resize', checkPosition);
        setInterval(checkPosition, 100);
    });

    var checkPosition = function() {
        var main = $('#main');
        var rightColumn = $('#sub');
        var fixedArea = $('#fixedArea');
        var contentsFooter = $('#contentsFooter');

        // mainカラムより右カラムの方が長い場合は何もしない
        if (main.height() <= rightColumn.height()) {
            return false;
        }

        // フッター上部の座標と固定開始位置
        // 高さや位置はJSの実行タイミングによって変わるので毎度計算する
        var footerTop = contentsFooter.offset().top;
        var fixStart = rightColumn.offset().top + rightColumn.height();

        // 表示領域高さ
        var windowHeight = $(window).innerHeight();

        // 画面スクロール領域を取得
        var windowPos = $(window).scrollTop() + windowHeight;
        var documentHeight = $(document).height();
        // 画面スクロール領域がドキュメントの高さより大きい場合は領域をドキュメントの高さに
        if (windowPos > documentHeight) {
            windowPos = documentHeight;
        }

        // 縦方向の制御
        var baseSelector = '#sub';
        var fixingSelector = baseSelector + ' #fixedArea';
        var fixed = fixingSelector + '.fixed';

        // 固定開始位置に画面が差し掛かってない場合
        if (windowPos <= fixStart) {
            $(fixingSelector).removeClass('fixed');
            $(baseSelector).height('auto');
            $(fixingSelector).width('auto');

        // 画面がフッターまで到達していない場合
        } else if (windowPos <= footerTop) {
            $(fixingSelector).addClass('fixed');
            $(baseSelector).height($(fixingSelector).outerHeight());
            $(fixed).css('bottom',0);
            $(fixingSelector).width($(baseSelector).width());

        // 画面がフッターに到達した場合
        } else {
            $(fixingSelector).addClass('fixed');
            $(baseSelector).height($(fixingSelector).outerHeight());
            $(fixed).css('bottom',(windowPos - footerTop));
            $(fixingSelector).width($(baseSelector).width());
        }
    };
}());
</script>

サイト訪問者に利益を生じさせるか

東京高裁はコインハイブのプログラムについて「サイト訪問者に利益を生じさせない」と判断したが、マイニングした仮想通貨をサイト運営資金にしてウェブサービスの質を維持向上するものであるなら、「サイト訪問者に利益を生じさせる」と判断できる。

Yahooは、右カラムがフッターに被ることを解消させることで、サイト訪問者に利益を生じさせるとするかもしれないが、Chromeで下記の方法でsetIntervalを止めてスクロール、リサイズを行ってもそのような不利益は確認できなかった。

Yahooは逮捕されるか

本件プログラムコードは、サイト訪問者のPCの電力を無限に消費するので金銭的な損害がある。
下記の方法でsetIntervalを止めたところ、Firefoxのタスクマネージャーの「消費電力への影響」が中から低に低減した。

プログラム使用者に生じる不利益に対する注意喚起はなく、その機能を認識した上で実行できないことから、反意図性を肯定できる。

Yahooが不正指令電磁的記録に関する罪で逮捕される可能性は否定できない。

微罪逮捕の是非

プログラマーは法規制とリベラリズムの間で葛藤しながらプログラミングする。
警察はガイドラインを提示し「やめないなら逮捕」と事前に注意喚起すればプログラマーはやめたはずだ。
アラートループ事件やコインハイブ事件のような微罪逮捕を正当化する余地はない。
警察が注意喚起せず逮捕することは、プログラマーを萎縮させ、安全にプログラミングできる裁量範囲を狭め、国家の競争力を削ぐ。

Yahooニュースの無限ループを止める方法

for (var i = 1; i < 99999; i++) window.clearInterval(i);

(参考: javascript - How can I clearInterval() for all setInterval()?

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1