スポンサーリンク

Webページの「コピペ禁止」を解除・回避するJavaScriptコード。スクリプト有効のまま,ブラウザ上で右クリック・テキスト選択の禁止タグを迂回する

Webページ上で,「コピペ禁止」を解除するJavaScriptコード。


ブラウザ上で,マウスで文章を選択して,右クリック→コピー
という操作は,HTML側で禁止できる。

Webサイトの内容が, コピペで無断転載されるのを防ぐためだ。


しかし,その禁止をかいくぐる方法もある。

たとえばブラウザの設定で「JavaScriptを無効にする」というのが一番簡単な方法。


もしJavaScriptを有効のまま,コピペ禁止だけを解除したい場合,

下記のJavaScriptコードを実行すればよい。

(Firefoxなら,Firebugのコンソール上で実行できる。)

// HTML5ではないページもあるし,
// Arrayのイテレータがない場合もあるので
// 古典的な記法を使う。

// 入れ替えるイベントリスナ
var f = function(){ return true; };

// 書き換え対象のDOMイベント名
var evs = "beforecopy beforecut click contextmenu copy dragstart mousedown mouseup selectstart".split(" ");

// 書き換え対象のCSS属性名
var props = "userSelect MozUserSelect MsUserSelect WebkitUserSelect".split(" ");

// 1要素に対する書き換え操作
function replace_events( elem ){
  // イベント
  for( var i = 0; i < evs.length; i ++ ){
    elem[ "on" + evs[i] ] = f();
  }
  // CSS属性
  if(elem.style){
    for( var i = 0; i < props.length; i ++ ){
       elem.style[  props[i] ] = "";
    }
  }
}

// 全要素に対し
var elems = document.getElementsByTagName("*");
for(var i = 0; i < elems.length; i ++){
  replace_events( elems[i] );
}
replace_events( document );

これで,どんなページでも大概はコピペ可能。

サイト側が WordPress のプラグインでコピペ禁止処理を実装している場合なんかは,これで突破できる。


注意:悪用を禁ずる。


解除コードの解説

Webページ上でコピペを禁止する方法は2つあって,
(1)JavaScriptを使う手と
(2)CSSを使う手 
がある。


これらの「コピペ防止」テクニックは,下記の記事にまとめられている。

HTML・CSS3・JSを使い,Webサイトを「コピペ禁止」にする方法のまとめ。右クリックや文字列選択・内容の複製をできなくする無効化テクニック集
http://computer-technology.hateblo.jp/entry/20150717/p1

  • Webページを「コピペ不可能」にするためのテクニックまとめ。
  • マウスで右クリックしてコピー,Ctrl + C で無断転載,などの行為を禁止できる。 CSSやJavaScriptでの手法を網羅した。


JavaScriptによるコピペ禁止とは,マウス操作のイベントを封じるものだ。

文字列の選択や右クリックにより発生するイベントリスナで false が返ってくると,コピペできない。


そこで,それらのイベント発生時に true が返るように小細工で上書きする。

document.onmousedown = function(){ return true; };
document.onmouseup = function(){ return true; };

document.onclick = function(){ return true; };
document.oncontextmenu = function(){ return true; };

document.ondragstart = function(){ return true; };
document.onselectstart = function(){ return true; };

document.oncopy = function(){ return true; };
document.oncut = function(){ return true; };
document.onbeforecopy = function(){ return true; };
document.onbeforecut = function(){ return true; };

これでマウス操作が可能になる。


しかし,JSでマウス操作が可能になっても,さらにCSSで文字列選択を禁じることができる。

Firefoxで,ページ全体で文字列の選択を禁じるには,下記のようなCSSを書けばよい。

body{
  -moz-user-select : none;
}

userSelectはCSS3の属性で,ブラウザごとに対応が分かれる。

そのためベンダプレフィクスは適宜,付け替える。


このようなCSS宣言があるとコピペできないので,
冒頭のコードではCSSプロパティも上書きしている。

動的に上書きする際,ベンダプレフィクス部分はJS内で大文字始まりなので注意。

MozUserSelect style property | webkitUserSelect style property JavaScript
http://help.dottoro.com/ljrlukea.php

  • if ('MozUserSelect' in div.style) { div.style.MozUserSelect = selectState;

WordPressのプラグインを突破できる

こうすることで,WordPressのコピペ禁止プラグイン「WP-COPYPROTECT」をも突破できる。

WP-COPYPROTECTは,下記のようなJavaScriptをサイト内に生成している。

/******************************************************************************
***   COPY PROTECTED BY CHETANGOLE.COM/BLOG/WP-COPYPROTECT   version 3.0.0 ****
******************************************************************************/

function clickIE4(){
	if (event.button==2){
		return false;
	}
}

function clickNS4(e){
	if (document.layers||document.getElementById&&!document.all){
		if (e.which==2||e.which==3){
			return false;
		}
	}
}

// mousedownとcontextmenuが無効化される。

if (document.layers){
	document.captureEvents(Event.MOUSEDOWN);
	document.onmousedown=clickNS4;
}
else if (document.all&&!document.getElementById){
	document.onmousedown=clickIE4;
}

document.oncontextmenu=new Function("return false");


// selectsrartイベントが無効化される。
// CSSでuserSelect属性が指定される。

function disableSelection(target){
	if (typeof target.onselectstart!="undefined") //For IE 
		target.onselectstart=function(){return false}
	else if (typeof target.style.MozUserSelect!="undefined") //For Firefox
		target.style.MozUserSelect="none"
	else //All other route (For Opera)
		target.onmousedown=function(){return false}
	target.style.cursor = "default"
}

copyprotectプラグインがやっていることも,
JSイベントとCSS属性の書き換えであることがわかる。


なので,プラグインよりも後出しで,
同じようにJSイベントとCSS属性を書き換えてしまえば
このプラグインの挙動を相殺できるわけだ。

他の方法

他にも,コピペ禁止を解除するテクニックは存在する。


Firefoxの設定画面から,contextmenuイベントそのものを無効化できるオプションがある。

dom.event.contextmenu.enabled を false にすれば,
サイト側で右クリックメニューの無効化ができなくなる。

右クリックによるコンテキストメニューを無効にしているページでも右クリック可能とする(Firefox) - Enjoy*Study
http://blog.enjoyxstudy.com/entry/201...

  • コンテキストメニューには、ブラウザのアドオンによるメニューなどもある
    • なので、無効になってしまっているととても困る
  • Firefoxだと、このコンテキストメニューを無効としているのを回避することができます。
  • アドレスバーで about:config と入力し、 dom.event.contextmenu.enabled の設定をfalseに変更


Firefox 23以降でJavaScriptや右クリック禁止を標準機能だけで無効にする方法とか - はりをきば
http://blog.gutyan.jp/entry/2013/08/1...

  • about:configから行きます。 ページ内検索で「dom.event」と入力。
  • 「dom.event.clipboardevents.enabled」と 「dom.event.contextmenu.enabled」を それぞれ「false」に切り替え。
    • dom.event.clipboardevents.enabledは oncopy(コピー) oncut(切り取り) onpaste(貼り付け) を、
    • dom.event.contextmenu.enabledは oncontextmenu(右クリックメニュー)の JavaScriptイベントの有効/無効を設定できる。


今回の記事で取り上げたのと同じJSコードを,ブックマークレットで実行するという手もある。

コピペ有効化のほかに,ページ拡大の有効化などの機能もある。

WEBページのコピー・ペースト・カット禁止の禁止 - それマグで!
http://takuya-1st.hatenablog.jp/entry...

  • なんだこの、すべての入力項目を2度入力させるのは、 ばかじゃないの。
  • というわけで、コピペ禁止の禁止
    • ["onpaste","oncopy","oncut"].forEach(
    • コンソールに貼って実行,もしくはブックマークレット


拡大操作禁止のWebページを強制的に拡大可能にする方法(iOS向け)
http://hitoriblog.com/?p=27736

  • 強制的に拡大可能にするブックマークレットを作ってみました。


もっと言えば,最終的にはHTMLソースを見ればコピペできるし,
あるいはDOMインスペクタを介してターゲット内の文字列を取得することもできる。

RSSフィードから本文をコピペする手もある。

ブログ記事のコピーと右クリック禁止でパクリ転載防止する方法 - うさもふ
http://www.usamofu.com/entry/Steal

  • はてなブログの場合は、パクりたいブログ記事をRSS登録すれば、RSS経由で記事を全部一気にコピペしてパクって転載することが出来ます。


猛者なら,画面キャプチャしてOCRで文字認識,という強硬手段もある。

テキストコピーできないwebサイトからコピーするには | IT って難しいね
http://bemo-st.com/pc/wp/2014/03/20/442/

  • 画面のハードコピーは出来る
  • OCRソフトなどを使って画像から文字起こしすることも出来ます
  • 画像を見ながらキーボード入力
  • しかし面倒なので,やはりマウスを使ってコピペできればそれに越したことは無い。

結論

ここまで見たように,どう禁止しても何かしらかいくぐるすべはあるのだ。

一般に,セキュリティを深めるためには,
突破法を見つける作業が役に立つ。

今回の記事も同様の性質を持つ技術的な知見であると考えよう。


関連する記事:

iPadやiPhoneのセキュリティの危険性について,知らない人がいたら見せるためのページ (Apple製品を狙ったウイルスについての理解を深めよう)
http://language-and-engineering.hatenablog.jp/entry/20140124/iOSSecurityVulne...


Windows XP等の,IE脆弱性の攻撃方法「ヒープ・スプレー」と「Use After Free」を,HTMLサンプルコードで理解しよう
http://language-and-engineering.hatenablog.jp/entry/20140508/IEBrowserHeapSpr...


バッチで,リファラを改ざんし,ユーザエージェントを改ざんし,POSTリクエストを自動発行しよう (HTTPリクエストヘッダを自由に生成)
http://language-and-engineering.hatenablog.jp/entry/20100914/p1


ウィルス対策ソフトをかいくぐって ADODB.Stream を使う (WSH/JScriptでUTF8の入出力・続編)
http://language-and-engineering.hatenablog.jp/entry/20090216/p1


簡単なコマンドでXPパソコンの脆弱性を攻撃し,すぐ乗っ取りに成功する動画 (Metasploitフレームワークを使ってWindowsを不正に遠隔操作)
http://language-and-engineering.hatenablog.jp/entry/20140512/HowToExploitWind...