S-JIS[2010-07-18] 変更履歴

画面コピーを禁止する方法

ブラウザーの画面(情報)のコピーを禁止する方法について。


ポップアップメニューの禁止

ブラウザー上で右クリックするとコンテキストメニュー(ポップアップメニュー)が開く。
ここに「コピー」や「切り取り」といったメニューがあるので、コンテキストメニュー自体を禁止すればコピーすることは出来なくなる。

<body onContextmenu="return false">
	<h1>onContextMenu</h1>
	<p>右クリックでコンテキストメニュー(ポップアップ)が出なくなる。</p>
</body>

ただしその他の便利なメニューも使えなくなってしまうので、コピーを禁止したいのであれば、コンテキストメニューを禁止するのではなく、コピー自体を禁止する方がいい。


コピー&カットの禁止

onCopy・onCutでfalseを返すことにより、メニューバーからの「コピー」「切り取り(カット)」やそのキー入力(Ctrl+CCtrl+X) でのコピー&カットを禁止することが出来る。

ただしメニュー自体が禁止(灰色表示で選択不可)になるわけではないので、ユーザーが操作は出来るけれども、実際にはクリップボードにコピーされない。
エラーメッセージを出す方が親切かも。

onBeforeCopy・onBeforeCutというイベントもあるが、これらはポップアップメニューを表示する時でも呼ばれるようなので、エラーメッセージを出すような使い方には向かない。


ページ全体のコピー&カットの禁止

ページ内の全ての文章に対してコピー&カットを禁止したい場合は、body要素にonCopy・onCutを記述する。

<body onCopy="return false" onCut="return false">
<form>
	<h1>onCopy</h1>
	<p>コピー不可</p>
	<p><input type="text" value="abc"></p>
</form>
</body>
<body
	onCopy="alert('コピー禁止');  return false"
	onCut ="alert('切り取り禁止');return false"
>

特定要素のコピー&カットの禁止

禁止したいタグだけにonCopy・onCutを記述すれば、そのタグだけコピー&カットを禁止できる。

ただし、コピー可能領域と合わせて範囲選択されてしまうと、コピー禁止領域もコピーできてしまう。

<body>
<form>
	<h1>onCopy</h1>
	<p onCopy="alert('コピー不可');return false">コピー不可</p>
	<p><input type="text" value="abc" onCopy="alert('コピーできません');return false" onCut="alert('カットできません');return false"></p>
</form>
</body>

pタグにonCutを入れていないのは、表示専用のタグでは元々カットすることは出来ないので、記述しても呼ばれないから。


WebBrowserでのコピーの禁止

WebBrowserコントロールでコピーを禁止したい場合は、onbeforecopyでイベントをキャンセルすればいいそうだ。
(JavaScriptで禁止する場合と同様、oncopyでもいいような気はする)

参考: 魔界の仮面弁士さんのWebbrowserでコピー不可にしたい


選択の禁止

unselectable属性

マウスでドラッグしたりShiftキーを押しながらカーソルを移動したりしてテキストを選択することが出来る。
各要素のunselectable属性をonにすることにより、選択すること自体を禁止することが出来る。

<body>
<form>
	<p unselectable="off">選択可<p>
	<p unselectable="on">選択不可<p>
	<p unselectable="on"><input type="text" value="abc">p要素が選択不可</p>
	<p><input type="text" value="abc" unselectable="on">input要素が選択不可</p>
</form>
</body>

unselectable属性がonになっている要素内のテキストは選択することが出来ない。
ただし選択可能なテキストと合わせて範囲選択すると、選択できてしまう。

また、unselectableの設定は子要素には引き継がれない。

input要素の場合、マウスクリックによってそのエリアが選択できなくなる(フォーカスが移らない)だけで、Tab移動によってフォーカスが移れば、その中のテキストを選択することは出来る。


子要素にunselectableの設定が伝播しないので、ページ全体を選択不可にしたい場合は、全要素にunselectableを付ける必要がある。
JavaScriptを使って全要素にunselectableを設定することが出来る。

※input要素にまで付けてしまうと操作が面倒になるので、input要素は除外している。

<html>
<head>
<title>unselectable all</title>
<script type="text/javascript">
function unselectAll() {
	for (var i = 0; i < document.all.length; i++) {
		var obj = document.all[i];
		if (obj.tagName != "INPUT") {
			obj.unselectable = "on";
		}
	}
}
</script>
</head>
<body onload="unselectAll()">
<form>
	<h1>unselectable</h1>
	<p>選択不可<p>
	<p><input type="text" value="abc"></p>
</form>
</body>
</html>

全体が選択禁止になると、Ctrl+Aによる全選択も出来なくなる。


onSelectStartイベント

body要素のonSelectStartでfalseを返すことによって選択を禁止することも出来る。

この場合、input要素も正しく動作する。(クリックしてフォーカスを与えることが出来て、ドラッグやShiftキーによる範囲選択は出来ない)

<body onselectstart="return false">
<form>
	<h1>onselectstart</h1>
	<p>選択不可<p>
	<p><input type="text" value="abc"></p>
</form>
</body>

参考: KaZuhiro FuRuhataさんのページ全体の選択を禁止する


印刷の禁止

カスケーディングスタイル(CSS)を使って、印刷を禁止する、というか、印刷時に何も出力しないことが出来る。
(真っ白な状態で印刷される。印刷プレビューで見ても真っ白になる)

<html>
<head>
<title>印刷禁止</title>
<style type="text/css">
@media print {
	body { display:none; }
}
</style>
</head>
<body>
	<h1>印刷禁止</h1>
	<p>印刷プレビューで見ても真っ白</p>
</body>
</html>

画面キャプチャーの禁止

画面キャプチャー(PrintScreenキーによる画面自体のコピー)はWindowsの機能であってブラウザーの機能ではない為、ブラウザー側の設定で画面キャプチャー自体を禁止することは出来ない。
が、JavaScriptでクリップボードを操作することは出来る。画面キャプチャーはクリップボードに画像がコピーされるので、人間が操作できないような短い間隔でクリップボードを消去することにより、結果として画面キャプチャーを阻止できる。

<html>
<head>
<title>screen capture</title>
<script type="text/javascript">
	setInterval("window.clipboardData.clearData()", 100);
//	setInterval("window.clipboardData.setData('Text','')", 100);
</script>
</head>
<body>
	<h1>画面キャプチャー拒否</h1>
</body>
</html>

setInterval()を使って、100ミリ秒毎にクリップボードを変更している。
(clearData()の場合はクリップボードの消去、setData()の場合は空文字列のセット)

この画面がブラウザーで表示されている限り、この消去処理は行われる。(ブラウザーがバックグラウンドになったとしても)
つまりこの間、画面キャプチャーだけでなく、通常の文字列のコピー&カットも行うことは出来ない。(このタイマー処理によってクリップボードが消されてしまうから)
この影響はブラウザー内だけでなく、全てのアプリケーションのコピー&カット操作に及ぶので要注意。

画面キャプチャー用のツールとか使えばこの方法を回避して(クリップボードを介さずに)キャプチャーできるし、極端な事を言えば画面をカメラで撮ればコピーしたようなものだし、どこまで対策すればいいのか難しいと思う。


docomo

docomo(iモードブラウザ2.0以降)の場合、metaタグでコピーや画面キャプチャーを禁止することが出来るんだそうだ。

記述例 内容
<meta name="prohibition" content="image"> 画像保存・画面メモ・スクリーンキャプチャー機能の禁止
<meta name="prohibition" content="image,text"> 画像およびテキストコピー機能の禁止

参考: MEMORVAさんの携帯サイト作成の便利なタグ


HTMLへ戻る / JavaScriptへ戻る / 技術メモへ戻る
メールの送信先:ひしだま