動画への直リンクを禁止する方法とファイル名の隠蔽

October 1, 2014

HTML5 でサポートされるようになった video タグで動画ファイルを公開するときに、mp4 ファイル等への直リンクを防ぐ方法のメモです。「直リンクを防ぐ」とは、自分のサイト以外の video タグからは動画が再生できないようにする、ということです。

クッキー(cookie)を使う方法をメインで書きます。追加で動画のファイル名を隠蔽する方法にも少し触れています。直リンクを防ぐだけなら、画像と同様にリファラーを見る方法もありますが、動画の場合、ちょっとだけ これじゃない感がありました。

Image

具体的には、自分のサイト上にてクッキーを設定し、.htaccess でそのクッキーが無い場合はファイルへのアクセスを拒否(deny)します。クッキーを使うので、自分のサイトと動画ファイルが置いてあるサイトは同じドメインに所属している必要があります(逆にいうと、同じドメイン配下なら、別サーバーに動画ファイルを置いても大丈夫です)。

video タグは、iPhone(iOS)や Android などのスマートフォンに代表されるモバイル端末でも再生できるので便利ですよね。

サイトにて Cookie を設定する

まずはサイト上に、閲覧者が自分のサイトをブラウズしたことを記録するためにクッキーを設定します。html ヘッダに書く、PHP や JavaScript を使う、など お好みの方法でどうぞ。以下は html ヘッダに書く場合の例です。

<meta http-equiv="set-cookie" content="videoaccess=true;">

動画ファイルが別サーバー(サブドメイン)に置いてある場合

<meta http-equiv="set-cookie" content="videoaccess=true; domain=example.com;">

クッキーをセットするときにドメインを指定すると、サブドメインでもそのクッキーが読めるようになります。

動画ファイルは、とりあえず同じサーバーに置く場合でも、サブドメインを割り当てておくと、将来的にサーバーを分離するとき手間が少ないので考慮した方がよいと思います。

なんとなく httponly にしてみる

<meta http-equiv="set-cookie" content="videoaccess=true; domain=example.com; httponly;">

JavaScript(jQuery)

筆者は jQuery が好きです。jquery-cookie プラグインを導入すれば以下のように書けます。

$.cookie('videoaccess', 'true', { domain: 'example.com' });

.htaccess で Cookie によるアクセス制御をかける

動画ファイルが置いてあるディレクトリに以下の .htaccess ファイルを配置します。

SetEnvIf Cookie "videoaccess=true" ok

order deny,allow
deny from all
allow from env=ok

最初の行は、「videoaccess」というクッキーに「true」という文字列が設定されている場合、「ok」という環境変数を定義します。最後の行で、その環境変数が定義されていた場合のみ、アクセスを許可しています。

SetEnvIf について詳しくは Apache のドキュメントをご参照ください。

アクセス制御の対象を特定ファイルのみにする方法

さきほどの記述を Files ディレクティブで囲みます。以下の例は、最初の行に列挙されている拡張子のファイルのみアクセス制御が適用されます(それ以外のファイルはすべてアクセスが許可されます)。

<Files ~ "\.(avi|mp4|ogv|webm|f4v)$">
	SetEnvIf Cookie "videoaccess=true" ok

	order deny,allow
	deny from all
	allow from env=ok
</Files>

もっと本格的 ファイル名を隠蔽する

.htaccess は、外部からの要求に対するアクセス制御です。.htaccess で完全に外部アクセスを遮断(deny from all)しておき、特定の条件を満たしたときだけ、PHP など内部のサーバー プログラムでファイルを読み出して送出するという方法もあります。

例えば、ファイル名と現在の日時やセッション ID などから文字列を生成し、video タグの src に「/hoge/video.php?4db05f6ac5」等とパラメータとして指定します。video.php でパラメータ(4db05f6ac5)からファイル名を特定し、ヘッダを付けてそのファイルを送出するわけです。パラメータからファイル名を特定するロジックはプログラムした本人にしか分かりませんので、誰かが適当に付けたパラメータでは動画にアクセスできない、というわけです。

これを実現するには、クライアント側が動画と認識して再生できるように読み出したファイルを送出してあげる必要があり、そこが割りと苦労する部分のようです。クライアント側が iPhone(iOS)や Android などのモバイル端末だと尚更です。

筆者は現状、そこまでのアクセス制御は必要ないため試していませんが、参考になりそうなページをいくつかメモしておきます。

MP4 ファイルを PHP で読み出して出力する方法

流し読みした感じだと、Content-Range ヘッダーの指定がポイントみたいですね。

関連サイト

少し戻って、クッキーリファラーによる直リンクを防ぐ方法について、参考になりそうなページのメモです。

リファラーでも良いような気はしますね…
ただ、空のリファラーを許可せざるを得ない時点で なぜか負けた感がありますw

検証するときの注意

試してみるときの注意点です。

  • ブラウザのキャッシュはクリアする
    (アクセスを禁止したのに表示される! 実はキャッシュでしたー は すごく がっかりするのでお気を付けを…)
  • .htaccess の改行コードは LF
    (Web サーバーが Linux の場合)

最後に

ここまで書いておいてナンですが、動画の公開には差し支えないなら YouTube を使うのが最も簡単です。転送量を気にする必要もありませんし、なにしろ無料です。

YouTube は諸般の事情で使えないけど お金なら出すよ、という場合は、「動画配信 ASP」などで検索すれば、安くて良さそうなサービスが沢山みつかりますので、それを検討するのも良いですね。サイトの規模が大きくなると、転送量の関係で単体の Web サーバーだけではつらくなるので、結局は動画配信のためのコストを意識する必要が出てきます。

この記事は、筆者のように、小規模スタートで ある程度は自分で技術面をカバーし、コスト(リスク)を可能な限り小さくしたい場合に必要な情報だと思います。ヒットする範囲は かなり狭そうですが、どなたかのお役に立てば幸いです。

コメントを残す

メールアドレスが公開されることはありません。