練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

Proxomitron: ブラウザでのコピー操作を監視するスパイウェアからの防御

コメントなし»

WordPress:誰かが記事をコピーしたら教えてくれるプラグインCCC(Check Copy Contents)を作ってみた。 | 着ぐるみ追い剥ぎペンギン

誰かが、あなたのブログの文章をコピーしたら、そのコピーされた箇所とページのURLを、こっそりとあなたにメールで通知します。

(リンク先より引用)

という恐ろしい WordPress プラグインがありまして、それに対する防御策の実験です。

以下のコードを実行する <script> タグをページに挿入することで、copy イベントから window.getSelection()document.selection.createRange() が呼ばれた場合に警告を表示して、ダミーのデータ(「輝け」)を返します。

  function hook (obj, name, func) {
    var orig = obj [name];

    var k = '__prox_' + name;
    if (!obj [k]) {
      obj [k] = orig;
    }

    obj [name] = func;
    return orig;
  }

  function hookSelection () {
    function msg (s) {
      alert (location.href + '\n\n' + s + ' is called from oncopy event.');
    }

    if (window.getSelection) {
      hook (window, 'getSelection', function () {
	if (!window.event || window.event.type !== 'copy') {
          return window.__prox_getSelection ();
	}
	msg ('window.getSelection');

	var sel = {
          anchorNode: null,
          anchorOffset: 0,
          focusNode: null,
          focusOffset: 0,
          toString: function () { return 'Shine'; }
	};
	return sel;
      });
    }

    if (document.selection.createRange) {
      hook (document.selection, 'createRange', function () {
	if (!window.event || window.event.type !== 'copy') {
          return document.selection.__prox_createRange ();
	}
	msg ('document.selection.createRange');

	var rng = {
          setStart: function () { },
          setEnd: function () { },
          cloneContents: function () { return document.createTextNode ('Shine'); },
          text: 'Shine',
          htmlText: 'Shine',
          toString: function () { return 'Shine'; }
	};
	return rng;
      });
    }
  }
  hookSelection ();

問題のプラグインの現状のコードがダミーのデータを消化できる程度に偽のプロパティを用意してありますが、ダミーを返す代わりに問答無用で例外を投げちゃってもいいかも知れません。

あと document.getSelection() も潰した方がいいかも。

copy イベント以外での監視には対応していないので、例えば window.setInterval() で監視、など防御策に対する対抗措置が取られると対応が難しいです。スパイ目的ではなく動的なウェブ表現のために選択範囲の取得を行うページもあるので、全てをブロックするという訳にもいかないと思うので。

こんな面倒な方法ではなくて、単にブロックリストに以下のように追加する手もありますが、パス名を変更されるとブロックできません。

*/wp-content/plugins/check-copy-contentsccc/

ブロックリストにおいて * から始まる URL だとハッシュ化されない、というのもマイナスポイント。

2016-02-12 イベント外から呼び出されると window.eventnull のためエラーになるので修正しました(赤字部分)。

コメントを残す

メールアドレスが公開されることはありません。