右クリックを禁止しても、基本的には、HTMLソースを見られてしまえば「終わり」という事態が発生しえます。しかしながら、HTMLソース全体を暗号化すると、SEOへの影響が心配だったり、「ちょこっと文字を修正したい場合などに大変」とか問題もあります。ただ、プロテクトしたいコンテンツがHTMLソースそのものであったり、テキスト本文ではなくて、画像ファイルやJSファイル(JavaScript)、CSSファイル(スタイルシート)である場合、baseタグを使って、これららをプロテクトする方法があります。 1.そもそもbaseタグとは?baseタグによって、リンク先や画像などのパスの基準となるURLを指定できます。例えば、このページでは、<base href="http://www.broadband-xp.com/hidesource/base123/"> としています。 そして、下記の画像: を表示するためのソースは、 <img src="t_flower.jpg"> となっています。ここで、baseタグの仕組みを理解できない人は、このページのURLが「 http://www.broadband-xp.com/hidesource/base.html 」であるので、画像の本体のパスは 「 http://www.broadband-xp.com/hidesource/t_flower.jpg 」であるかのように誤認します。 しかし、実際にこのURLにアクセスしてみると、ファイルが存在しないために、「404エラー ファイルが見つかりません。」になります。この画像の本当のパスは、baseタグとの組み合わせにより、「 http://www.broadband-xp.com/hidesource/base123/t_flower.jpg 」になります。 ※ なお、本体策の大前提として、右クリック禁止の対策は既に行っていて、右クリックで画像のパスを確認することが不可能なようにしておく必要があります。 2.baseタグが丸見えでは、結局意味がないのでは?はい、執拗なユーザーから画像などをプロテクトするためには、もう少し対策を強化する必要があります。
a. baseタグをJavaScript化し、外部ファイル化します。 baseタグをdocument.writeで書き出すようにして、それをJSファイル化します。即ち、base.js(ファイル名は任意ですが、拡張子はjs)の中で、 document.write('<base href="http://www.broadband-xp.com/hidesource/base123/">'); としておいて、 ヘッダ部(<head>〜</head>)内で「 <script type="text/javascript" src="base.js"></script> 」と書いて読み込むようにします。 この対策により、画像を保存したいと考えたサイト訪問者は、まず、base.jsをダウンロードして、その中で指定されている基準となるURLを解明し、その次に、HTML本体のソース内に記された画像のパスと組み合わせて、画像のURLを解読するという二段階を踏まなければならなくなります。かなり、面倒な作業ですので、諦めてくれる可能性がそれだけ高くなります。 また、JavaScriptを解析できない多くの一括ダウンロードソフトに対しては、本体策で十分になります。 サンプル1 b. baseタグをJavaScript化し、外部ファイル化した後、そのJSファイルを暗号化します。 いくら、上記「a.」のやり方で外部ファイル化しても、その外部ファイルを再ダウンロードしたり、キャッシュファイルから探し出された場合、基準となるURLが分かりますので、本当の画像ファイルのパスが分かってしまいます。そこで、当サイトのウェブマスターが開発したHTML暗号化ソフト「SHTML」を使って、この外部ファイルを暗号化してみます。 「SHTML」では、JavaScriptの暗号化に特化した「JS Encoder」というメニューがありますので、このメニューで難読化・暗号化が可能です。「 document.write('<base href="http://www.broadband-xp.com/hidesource/base123/">'); 」を難読化・暗号化することを考えます。 サンプル2(JSファイルを難読化させた例) ※ SHTMLの体験版は、「難読化」の範囲なら制限事項なく30日間、難読化できます。SHTML体験版のダウンロードはこちら サンプル3(JSファイルを難読化+暗号化させた例) 3.考慮すべき問題などbaseタグを活用することで、あらかじめ、このbaseタグの特性を知り、余計な問題が生じないようにしなければなりません。
4.結論このbaseタグを活用した画像のパス隠蔽工作は、ページ全体を暗号化しないで済むため、SEOにやさしいというメリットを享受することができます。それでいてソースを見られても画像の本当のパスが分からないため、単純な方法でありながら、非常にすぐれた手法であると言えます。しかも、JavaScriptをoffにしているユーザーにはそもそも画像が見えないので、右クリックしても画像は保存できません。「JavaScriptをoffにしたら右クリックでいくらでも画像を保存できるではないか?」という批判には応えることができるはずです。画像保護が主な目的の方には、最高の手法であると言えるかと思います。 ただし、テキスト保護(テキスト本文/HTMLコーディングそのもの/外部ファイル化せずにHTML本体内に埋め込んだスタイルシート・JavaScript)などを主体に考えている場合には、「ソースを見られれば終わり」という問題をクリアすることはできません。 また、仮にbaseタグの部分を暗号化しても、それでも絶対に漏れないかというと、そういうことはありません。ですから、余裕のある方は、下記の方法のいずれか(もしくは、その全て)を併用してみることを検討してみてください。
a.ツールバー・メニューバーのないサブウインドウ内にコンテンツを表示させる
右クリックを禁止しても、メニューからソースなどは表示できます。ソース自体を表示させられないように、ツールバー・メニューバーを消したウインドウ内にコンテンツを表示させると、プロテクトの強度がそれだけ上がります。サブウインドウ表示用のJavaScriptは、HTML暗号化ソフト「SHTML」の付属ツール「Sub Window Maker 2007」(30日間利用可能な体験版でも、制限事項なく利用可能です。) b. Referer(参照元)をチェックする 画像を表示させる場合、ブラウザが画像をサーバーにダウンロード要求をします。その際、Referer(参照元)を通常、サーバに送信します。Refererには、画像を読み込んでいるページ(HTMLファイル)が残ります。もし、画像に直接アクセスしているならば、Refererが空になります。 即ち、Refererが空であれば、HTMLファイルを介さずに直接アクセスしている(かもしれない)ことを意味し、画像をコピーしようと考えているアクセスである可能性が高いです。ですから、Refererをチェックすることで、一定の防御策になりえます。 Refererをチェックするには、<img src="hogehoge.jpg">のようにするのではなく、<img src="getimg.php?filename=hogehoge">などのように、PHP・CGI(Perl)などのサーバサイド・プログラムを介して画像を表示させる仕組みを取るのが普通です。 もしくは、.htaccessを用いて、ディレクトリー単位で、Refererの妥当性をチェックする方法を取ります。いずれにしましても、多少のプログラム経験が必要なことは、どちらの方法でも一緒です。 さらに、Refererは偽装しようと思えば偽装できなくもないことはあらかじめ知っておく必要があるでしょう。また、もっと問題なのは、セキュリティ製品やその設定、またブラウザの設定・Proxyサーバの設定によっては、ユーザーに悪意がなくてもRefererが遮断されている可能性があります。ですから、無実の人を犯人扱いしてしまう可能性がありますので、注意してください。 c. 画像のパスを定期的に変更する baseタグで画像のパスを指定している場合に、もし高度な知識を持つ人間少数が先駆けて解読し、それのパスを不特定多数の人間に公開された場合、対策が無意味になります。画像のパスは定期的に変えておけば、このような情報も常に、古い間違った情報となります。 もちろん、画像置き場だからといって、「image」のような分かりやすいフォルダー名は避けるべきです。 d. キャッシュ対策をする いくら、画像の本当のパスが分からないようにしても、キャッシュ対策をしていなければ無意味です。弊社でもそのようなプログラムのお手伝いをさせていただくことは可能です。サポート(件名は変えないでください。)まで、ご相談ください。 また、baseタグが書かれたJSファイルを難読化・暗号化しない場合で、より強固なプロテクトを目指される場合は、JSファイルのキャッシュ対策も必須になってくるでしょう。 |