他サイトからムービーとかを直リンされて嫌ちっくなお話はよくでてくるのですが、これってmod_deny_deeplinkと同じ考え方で、URIベースでも実現できますね。
昨年Cookieベースで直リンクを制限するmod_deny_deeplinkモジュールというエイプリルフールネタをやりました。エイプリルフールネタとは言えちゃんと動くものなので所謂「ネタ」とは違うのでアレですが。これの考え方としては起点となるページでCookieを吐いて、直接リンクされたくないファイルへのアクセスはそのCookieをチェックするってなもんです。Cookieにはタイムアウトまでの時間と、改竄防止のためのHMACなハッシュ値をくっつけます。当然HTTP Cookieを喰わないclientはまったくアクセスできなくなるという問題が有ります。
考え方
ということで同じことをCookieじゃなくてpath_infoやquery-stringに埋め込んであげるだけ。利用イメージとしてはhttpd.conf or .htaccessで下記のように定義しておく感じかしら。StrictClickFlow /index.html /path/to/index.html StrictClickFlow /paht/to/index.html /mov/eroero.mpg /mov/moemoe.mpg ... StrictClickFlowSecret "fadklfja;eiurtadvmna;rk;wekfjadkfjaosrti"StrictClickFlowディレクティブは
StrictClickFlow リンク元URI リンク先URI [リンク先URI ...]みたいな使い方。逆の方が良いのかな?
で、Apacheモジュールでは今アクセスされているURIは判るので、該当するStrictClickFlowの設定を探して、リンク先のURIに
リンク元URI + タイムアウト時刻 + HMAC(リンク元URI + タイムアウト時刻 + 秘密鍵)をくっつけてあげる。くっつける方法は別に何でも良くて
- モジュール側で環境変数にセットしておいて、後はそれをSSIで埋め込んでもらう
- 専用のSSI的コンテンツハンドラを使ってもらう
リンク先ではURIに引っ付いている値を基に
- 正しいHMACかチェック
- StrictClickFlowで設定されたリンク元かチェック
- タイムアウト時刻を過ぎていないかチェック
これにより、(制限が必要な場面では)RefererやCookieに頼らなくともリンク先がリンク元を識別することができるようになるというわけです。
URIに制限しないで、リンク元をURLで定義できるようにしておくと、サイトを跨いだアクセスにも応用できるので良いのかもしれない。
というわけで
で、これをApacheモジュールで実装すれば、Webサイトの設計者が意図したリンクの辿り方に制限することができるのではないでしょうか。っと真面目に練った考えではないので、盲点と言うかウマくいかないケースがあるかもしれませんけど。あーindexページを開きっぱなしで、個々のリンク先をゆっくり順番に見る、といったブラウズスタイルに対応できない問題が有りますね。例によって実は作りはじめていたのですが、途中で飽きて放置したのは内緒。もし必要な方がいらっしゃいましたらお気軽にメールください。有償で完成させますので。 ←おぃ