東京マンガラボというサイトに漫画家のインタビュー記事の連載があり、今までに蒼樹うめ、吉富昭仁、 松本トモキなどが登場しています。
各インタビュー最後のページにイラストが掲載されているんですが、けっこう大きいピクセル数になってますね。
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.event
が null
のためエラーになるので修正しました(赤字部分)。
2013年08月19日の記事を表示しています。