HTML5 でサポートされるようになった video タグで動画ファイルを公開するときに、mp4 ファイル等への直リンクを防ぐ方法のメモです。「直リンクを防ぐ」とは、自分のサイト以外の video タグからは動画が再生できないようにする、ということです。
クッキー(cookie)を使う方法をメインで書きます。追加で動画のファイル名を隠蔽する方法にも少し触れています。直リンクを防ぐだけなら、画像と同様にリファラーを見る方法もありますが、動画の場合、ちょっとだけ これじゃない感がありました。
具体的には、自分のサイト上にてクッキーを設定し、.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 で読み出して出力する方法
- iphoneでmp4を出力する際のヘッダー – PHPプロ!Q&A掲示板
- iphone – Using php to output an mp4 video – Stack Overflow
- html5 video – MP4 plays when accessed directly, but not when read through PHP, on iOS – Stack Overflow
- how to prevent direct download of files in php – PHP – Codecall
流し読みした感じだと、Content-Range ヘッダーの指定がポイントみたいですね。
関連サイト
少し戻って、クッキーやリファラーによる直リンクを防ぐ方法について、参考になりそうなページのメモです。
- Apache のみで Cookie によるアクセス制御をかける – WebOS Goodies
- Cookie(クッキー)の届く範囲 (あいまいモード)
- 一括ダウンロードソフトを拒否する|ある技術者の備忘録
- PHP、ファイルの直リンクやURL直接入力での参照を禁止する(リファラを見ないやり方)
- refererによるアクセス制限 – yoshifumi1975’s diary
- サーバーの設定をカスタマイズ、よく利用する「.htaccess」の設定のまとめ | コリス
リファラーでも良いような気はしますね…
ただ、空のリファラーを許可せざるを得ない時点で なぜか負けた感がありますw
検証するときの注意
試してみるときの注意点です。
- ブラウザのキャッシュはクリアする
(アクセスを禁止したのに表示される! 実はキャッシュでしたー は すごく がっかりするのでお気を付けを…) - .htaccess の改行コードは LF
(Web サーバーが Linux の場合)
最後に
ここまで書いておいてナンですが、動画の公開には差し支えないなら YouTube を使うのが最も簡単です。転送量を気にする必要もありませんし、なにしろ無料です。
YouTube は諸般の事情で使えないけど お金なら出すよ、という場合は、「動画配信 ASP」などで検索すれば、安くて良さそうなサービスが沢山みつかりますので、それを検討するのも良いですね。サイトの規模が大きくなると、転送量の関係で単体の Web サーバーだけではつらくなるので、結局は動画配信のためのコストを意識する必要が出てきます。
この記事は、筆者のように、小規模スタートで ある程度は自分で技術面をカバーし、コスト(リスク)を可能な限り小さくしたい場合に必要な情報だと思います。ヒットする範囲は かなり狭そうですが、どなたかのお役に立てば幸いです。
Hi there, just became alert to your blog through Google, and found that it’s really informative. I am going to watch out for brussels. I’ll be grateful if you continue this in future. Many people will be benefited from your writing. Cheers!
Мой тренер Бородин Сергей Александрович 20.01.1983
Я отчетливо помню свою первую тренировку :
все необычно и ново. Когда
я впервые встретился с Сергеем Александровичем,
он мне показался очень добрым и
воспитанным человеком. На первом занятии, Сергей Александрович на нас не ругался, так как
мы были совсем неподготовленны,
а пытался во всем разобраться и научить. Сергей Александрович
давал ответы на все наши вопросы, рассказывал о том, знаменитая игра,
которой посвящают баллады, музыку, ради нее совершают
героические поступки.
На тренировке
я себя чувствовал комфортно и уверенно. Сергей Александрович Бородин является, в первую очередь,
интересным человеком и
личностью,который достиг в жизни определённой ступени. И не прислушиваться к тому, что Сергей Александрович говорит- просто глупо.
Мой первый и лучший тренер Бородин Сергей Александрович 20.01.1983