ネット上にアップロードした写真の保存を防ぐ

pencilcolor
誰もが一度は考えることの一つに「ネット上にアップロードした写真を誰かに保存されるのを防ぐことは可能か?」という問題がある。

mixiやFacebook、Twitterなどのソーシャルネットワーキングサービスが普及したおかげで、今では自分のブログやウェブサイトなどを持つ必要なく、誰もがネット上に写真をアップロードする時代になった。
自分の友人・知人などがそれらなどでプライベートな写真などをアップロードして掲載しているのを見ると、「非常に危ないなぁ」と私はいつも思う。

しかもFacebookにおいては実名込みだ。
前掲のソーシャルなどでは写真の公開範囲を「友人のみ」などに限定することができてそれを利用している人が多いと思うが、だからといってネットでの流出を防げるかと言えば、答えはNoだろう。
以前このブログでも書いた通りFacebookではアプリなどを利用して写真や名前などの個人情報を取得することは可能である。(参考記事は以下)

  1. Facebookの個人情報漏洩の危険性
  2. Facebookのスパムアプリから自分の個人情報を守る方法

インターネットというのは基本的に開かれた世界なので、アップロードしておいてそれの流出を防ぎたいというのはそもそも矛盾しているのではないかと個人的には思う。

Webブラウザがページを表示する原理

また、インターネット上(サーバー)にあるページをパソコンもしくはスマートフォンなどで表示する際には、そのページのHTMLファイルや画像(写真)ファイルなどをすべて閲覧する端末(クライアント)側にダウンロードしている。
そのデータを各端末にインストールされているウェブブラウザが解釈し、ディスプレイ上に表示しているわけだ。

つまり、パソコンやスマートフォンなどの画面に表示された写真というのは一時的にであれその端末にダウンロードされているということになる。
そこでその写真を保存するかどうかの選択肢はその端末側にあるわけだから、サーバー側でそれを規制するのは厳しい。
なので、

流出して困るような写真などはネット上にアップロードするな。

これが基本である。
これを逆に表現すれば、

ネット上にアップロードした写真は全世界に流出する可能性が必ずある。

と言ってもいいのではないでしょうか。

それでも保存されるのを防ぎたい場合は?

しかしそれでもネットにアップロードした写真が保存されるのを防ぎたいという要望があるのも事実である。
前述の説明のように完全な防御は不可だが、保存されにくくすることは可能だ。

もっとも簡単なのはJavaScriptで右クリックメニューを使用不可にしてしまうのが昔ながらの手っ取り早い手法である。
画面上でマウスの右クリックを押すと以下の画像のようにアラートウインドウが表示されるアレだ。
右クリックメニューを禁止

私はこれが昔から嫌いである。
こっちは写真の保存などする気がなく、ただテキスト文字をコピーしようとしただけでもこれが出ることがある。
とにかくこちらの操作を妨げられることが非常にウザい。
一応そのやり方を書いておくと、以下の記述をHTMLファイルのbody要素の属性として追記しておけばOKという非常に簡単な手法だ。

oncontextmenu="return false;"

しかしこんなものはちょっと知識のある人であればすぐに回避できるものなのでハッキリ言ってあまり意味がないうえに、前述の私の例のように画像ではなくテキスト文字をコピーしようとした際などの右クリックまでも規制してしまうので、トータルで考えるとデメリットのほうが大きいと思う。

右クリック禁止スクリプトをダウンロードできます

というわけで今回、ウェブページ上の画像のみを対象とした「右クリック禁止スクリプト」というものを簡易的に作ってみた。

ただこのスクリプトには弱点があり、右クリックだけでなくドラッグによる画像の保存をも禁止している影響で、画像がリンクになっている場合でもクリックを禁止してしまう。
つまりリンク先に画面偏移できなくなる。

仕組みを具体的に言うと、HTMLファイル内のimg要素に対して右クリック禁止とドラッグ禁止を適用しているだけという非常に簡易的なものだ。
リンク要素などを含むクリックさせたい画像に関しては、img要素を使わずに画像を表示させてね、ということになってしまう。

なので、リンク要素を含んでいる画像に関してはCSSで画像置換するなどして対応させる必要がある。
もうちょっと時間をかけて作ればその弱点を克服することも可能だと思うが、そこまでする必要性が感じられないし面倒なので今回はこの状態のまま公開である。

何度も言うが、ネット上にアップロードした時点で保存を完全に防ぐことは無理だし、閲覧者(ユーザー)側の操作を妨げるようなことは基本的にしたくないのですよ。

サンプルはこちら。
http://www.1-firststep.com/samplephp/imagemenu/
ダウンロードはこちらから。
http://www.1-firststep.com/samplephp/imagemenu/imagemenu.zip