ブログの特徴の一つとして、
Web 上のコンテンツと URL を一意に対応付ける
パーマ
リンク(Permalink)の存在を挙げることができます。
この恩恵にあずかって、自分の書いた記事の中で言及した
ブログ記事やサイトにディープ
リンクを貼るブロガーも多いことでしょう。
ブログを知っている人にしてみれば、これら
リンクは
ブログの醍醐味とも言うべき極めて自然なことのようですが、
その一方で、世の中には無断
リンク禁止や下層コンテンツへのディープ
リンク禁止を掲げるサイトも少なくありません。
書いたコンテンツを
Web に公開したいと思うものの、
URL の悪質な晒し上げなどからコンテンツを保護したいという(言わば我侭な)ニーズは確かにあるようです。
そこで今回、MovableType でディープリンク防止機構を実現するためプラグインを作成してみました。
MovableType でパーマリンクを捨てることの意味があるのか、いささか疑問ではありますが、
まぁシステム上実現できるに越したことはありません。
それを如何に使うか、それはユーザ次第ということで…
はじめに
ARTIFACT ―人工事実― : 自分が想定していないリンクを拒否するシステム/コメント欄の高機能化
では、無断
リンクやディープ
リンクに関する様々なサイトでの考察やソリューションが数多く集められています。
この記事が今回の
プラグインの作成の大きな動機となった訳ですが、
無断
リンクやディープ
リンク問題を考える上で、非常に有用な
リンクとして活用できました。
ここでは、ディープ
リンク、直
リンク禁止のためのソリューションとして Cookie を使用した一例が紹介されていますが、
ARTIFACT から辿り付いた
いしなお!:人によってパーマリンクが異なるシステム 実装例では、
Cookie と
PHP を利用してユーザ毎にパーマ
リンクが異なる
PHP のサンプルコードを公開されています。
今回、作成した
プラグインは、こちらの
PHP スクリプトを参考にしています。
これらエントリを基点として、rir6システムや
モヒカン族といった興味深い単語に出会えます(笑)
この
プラグインの導入により、個別エントリへのパーマ
リンク URL は、ユーザ毎エントリ毎に異なったものになります。
その URL は一人のユーザ専用となり、そのユーザ以外のアクセスを検知することが可能になります。
その URL にアクセスするには、サイトトップのインデックスなど規定のページを経由し、
認証用 Cookie の発行を受ける必要があります。
これにより、不特定多数が Cookie の発行を受けない特定のエントリへのディープ
リンクを直接辿ることをできなくします。
ディープ
リンクを拒否する具体的な仕組み(コード)については
いしなお!:人によってパーマリンクが異なるシステム 実装例
を参照してください。
仕様と制限
プラグインは、正確には、
MovableType のシステムでディープ
リンクを拒否するのではなく、
ディープ
リンクを拒否するための
PHP スクリプトを、
MovableType の
プラグインから簡単に埋め込めるようにしてあります。
これにより
テンプレートに
PHP スクリプトを直接書く手間を省き、コードの見通しを良くします。
実際にディープ
リンクを拒否するのは
PHP がその役割を担いますので、
サーバで PHP が動作する必要があります。
- 同じエントリであっても、ユーザ毎にパーマリンクが異なります【下記 URL(1),(3)】
- 同じユーザであっても、エントリ毎にハッシュ値が異なります【下記 URL(1),(2)】
- Cookie の認証を受けていないユーザは URL(1),(2),(3) に直接アクセスできません
- 既に Cookie の認証を受けたユーザ A は、ブックマークなどから URL(1),(2) に直接アクセスすることができます
- Cookie の認証が行われるページを自由に設定できます
ユーザ A のためのパーマリンクの例:
(1) http://www.magicvox.net/archive/2005/08091234.php?4f5e6d3c
(2) http://www.magicvox.net/archive/2005/08012468.php?fe603876
ユーザ B のためのパーマリンクの例:
(3) http://www.magicvox.net/archive/2005/08091234.php?3360ff6c
- MTUseDeepLinkBlocker
-
ディープリンク防止機構を使用するページの先頭に必要です。
このタグはディープリンク防止機構に必要な PHP スクリプトを書き出します。
- authorize
-
authorize が 1 の時、そのページは認証用 Cookie を発行します。
引数に authorize を持つ MTUseDeepLinkBlocker タグが記述されたページからリンクされた時のみ、
ディープリンク防止機構を持つページを表示することができます。
- thru
-
thru が 1 の時、そのページはディープリンク防止機構が動作しません。
MTDeepLinkDenied は常に偽となり、MTDeepLinkProtected は常に真となります。
このオプションの具体的な活用事例は
特定カテゴリの記事へのディープリンクを防止する MTDeepLinkBlocker 0.11を参照してください。
- MTDeepLinkBlockerHash
-
ユーザの認証用 Cookie とエントリID から、認証に必要なハッシュを生成します。
パーマリンクの後にこのハッシュを続けます。
- MTDeepLinkDenied
-
認証が済んでいないリクエスト時に真となるコンテナタグです。
逆条件は MTElse ではなく、後述の MTDeepLinkProtected を使ってください。
- MTDeepLinkProtected
-
認証済みのリクエスト時に真となるコンテナタグです。
逆条件は MTElse ではなく、前述の MTDeepLinkDenied を使ってください。
導入方法
Step 0.プラグインのインストール
プラグインを
ダウンロードし、
アーカイブに含まれる
MTDeepLinkBlocker.plを
MovableType の
プラグインディレクトリにコピーします。
そして、
MovableType の管理画面のメインメニューで、"使用可能な
プラグイン"欄に表示されていることを確認します。
Step 1.インデックスページのテンプレートを修正
インデックスページから
リンクを辿った場合のみ、個別エントリを表示する一例を紹介します。
認証を受けていないユーザは、必ずこのページから
リンクを辿る必要があります。
この作業で重要な
テンプレートタグは
MTUseDeepLinkBlockerと
MTDeepLinkBlockerHashです。
Step 1.個別エントリへのディープリンクを禁止する
個別エントリアーカイブにディープ
リンクされた場合、異なるコンテンツを表示する一例を紹介します。
一度、認証を受けたユーザは、Cookie が有効な間のみ、ディープ
リンクを直接辿ることができます。
この作業で重要な
テンプレートタグは
MTDeepLinkDeniedと
MTDeepLinkProtectedです。
トラブルシュート - 動かない時は?
この項目は作成中です。
いろいろ
- PHP スクリプトにより 1 ページにつきファイルサイズが約1KB増加します
- オリジナルの著作権表示を改変しない限り、自由に改造・転載・配布できます
作ってはみたものの、今のところ自分のサイトで使う予定も無く(´・ω・`)
MTDeepLinkBlocker
GetMD5Hash('MTDeepLinkBlocker011.zip');?>
| 0.11
| '05/08/19
| GetFileSize('MTDeepLinkBlocker011.zip');?>
| MovableType
|
3.151-ja で動作確認
|
最新版のダウンロードやバグレポートはDeepLinkBlocker の trac レポジトリでも行っています。
寄せられたコメント (全 2 件中、最新 5 件まで表示しています)
動作を確認できるようサンプルページを"はじめに"の節に設置しました。
MTDeepLinkBlockerのソースを見ると明らかですが、
プラグインで拡張したテンプレートタグでやっていることのほとんどは
PHPスクリプトを書き出すことだけなんですね。
実際の処理は、書き出されたPHPが頑張ってくれています。
…と、これを書いていて思ったんですが。
例えば、アクセスカウンタのPHPスクリプトを書き出すプラグインを作って
<MTEmbeddedCounter type="normal" figure="6">
みたいな書式で、ブログに埋め込めるようにしてやるんです。
PHP製の様々なパーツをプラグインというパッケージにして
簡単に配布、導入することができるんでないか、と。