2014.
01.
24
00:44:54
ファイルへの直リンクやURL欄に直接入力しての参照を禁止する方法です。
「特定のページを経由しないと表示できないようにする」と言った方が正確ですけどね。
ちなみに「PHP」とか書いておいてなんですが、別にPHPである必要性はありません。
単純に直リンクを禁止するだけなら
ファイルの直リンクを禁止する(リファラを見るやり方)
で書いたようなやり方でも良いのですが、もう少し厳密にやりたくてですね。
Aというファイル(今回はPDFとCSVの二種類のファイル)をBというページから
ダウンロードさせたいのですが、それ以外、例えばAへの直リンクや
URLを直接入力してAを参照することを禁止したかったのです。
ついでに書くと、Bは利用規約の画面なので絶対見て欲しい。
それを見ない限りダウンロードさせねーぞ!というのが経緯です。
さて、それではやり方ですが、実際のコードを見た方が手っ取り早いと思うので
サンプルをおいておきますね。
ファイルは
の4つが登場します。
中身はそれぞれこんな感じφ(--)
■.htaccess(PDF直リンクを拒否するために使用)
■test_before.php(利用規約画面)
■test.php(PDFをダウンロードさせる奴)
■test.pdf(ダウンロードさせるPDF)
※適当なPDF
これで「test.pdf」は「test_before.php」を経由した「test.php」からのみ参照できます。
「test.pdf」や「test.html」を直リンクしたり、URLを直接入力しても見ることはできません。
……もったいぶった割には大したことなかったですね(--ゞ
一応解説も書いておきますね。
■.htaccess(PDF直リンクを拒否するために使用)
は「拡張子『.pdf』と『.csv』には誰もアクセスすんな!」です。
あくまでhttp経由のアクセスに対しての制限なので、
CGIさんが内部的に参照する分には問題ありませんけどね。
■test_before.php(利用規約画面)
は、セッションにフラグを立てて、リンクを表示しています。
偉そうに言いましたが、見れば分かりますね、ハイ。
セッションにフラグを立てているのは「このページ見たよ!」の目印です。
今回は楽なのでPHPで作りましたが、PerlでもJavaでもRubyでも、お好きにどーぞ。
■test.php(PDFをダウンロードさせる奴)
は、セッションを参照して「flg」に「ok」が設定してあれば、
つまり「test_before.php」を経由していればPDFをダウンロードさせます。
「test_before.php」を経由していなければサヨナラです。
そんな感じ(--)ノ
まとめると
1.「.htaccess」で保護したいファイルへの直接アクセスを禁止する
2.保護したいファイルはCGI経由で表示する
3.「2.」のCGIで正規のルートでのアクセスかを(セッションを使ったりなんだりで)チェックする
ってなやり方です。
完了\(--)/
「特定のページを経由しないと表示できないようにする」と言った方が正確ですけどね。
ちなみに「PHP」とか書いておいてなんですが、別にPHPである必要性はありません。
単純に直リンクを禁止するだけなら
ファイルの直リンクを禁止する(リファラを見るやり方)
で書いたようなやり方でも良いのですが、もう少し厳密にやりたくてですね。
Aというファイル(今回はPDFとCSVの二種類のファイル)をBというページから
ダウンロードさせたいのですが、それ以外、例えばAへの直リンクや
URLを直接入力してAを参照することを禁止したかったのです。
ついでに書くと、Bは利用規約の画面なので絶対見て欲しい。
それを見ない限りダウンロードさせねーぞ!というのが経緯です。
さて、それではやり方ですが、実際のコードを見た方が手っ取り早いと思うので
サンプルをおいておきますね。
ファイルは
.htaccess(PDF直リンクを拒否するために使用)
test_before.php(利用規約画面)
test.php(PDFをダウンロードさせる奴)
test.pdf(ダウンロードさせるPDF)
test_before.php(利用規約画面)
test.php(PDFをダウンロードさせる奴)
test.pdf(ダウンロードさせるPDF)
の4つが登場します。
中身はそれぞれこんな感じφ(--)
■.htaccess(PDF直リンクを拒否するために使用)
<Files ~ "\.(pdf|csv)$">
deny from all
</Files>
deny from all
</Files>
■test_before.php(利用規約画面)
<?php
//セッション開始
session_start();
//セッション値設定
$_SESSION{'flg'}= "ok";
?>
<a href="test.php" target="_blank">PDFダウンロード</a>
//セッション開始
session_start();
//セッション値設定
$_SESSION{'flg'}= "ok";
?>
<a href="test.php" target="_blank">PDFダウンロード</a>
■test.php(PDFをダウンロードさせる奴)
<?php
//セッション開始
session_start();
if(isset($_SESSION{'flg'}) && $_SESSION{'flg'} == "ok"){
//PDF出力
header("Content-Disposition: attachment; filename=test.pdf");
readfile(dirname(__FILE__) . "/test.pdf");
}else{
print "不正遷移";
}
?>
//セッション開始
session_start();
if(isset($_SESSION{'flg'}) && $_SESSION{'flg'} == "ok"){
//PDF出力
header("Content-Disposition: attachment; filename=test.pdf");
readfile(dirname(__FILE__) . "/test.pdf");
}else{
print "不正遷移";
}
?>
■test.pdf(ダウンロードさせるPDF)
※適当なPDF
これで「test.pdf」は「test_before.php」を経由した「test.php」からのみ参照できます。
「test.pdf」や「test.html」を直リンクしたり、URLを直接入力しても見ることはできません。
……もったいぶった割には大したことなかったですね(--ゞ
一応解説も書いておきますね。
■.htaccess(PDF直リンクを拒否するために使用)
<Files ~ "\.(pdf|csv)$">
deny from all
</Files>
deny from all
</Files>
は「拡張子『.pdf』と『.csv』には誰もアクセスすんな!」です。
あくまでhttp経由のアクセスに対しての制限なので、
CGIさんが内部的に参照する分には問題ありませんけどね。
■test_before.php(利用規約画面)
<?php
//セッション開始
session_start();
//セッション値設定
$_SESSION{'flg'}= "ok";
?>
<a href="test.php" target="_blank">PDFダウンロード</a>
//セッション開始
session_start();
//セッション値設定
$_SESSION{'flg'}= "ok";
?>
<a href="test.php" target="_blank">PDFダウンロード</a>
は、セッションにフラグを立てて、リンクを表示しています。
偉そうに言いましたが、見れば分かりますね、ハイ。
セッションにフラグを立てているのは「このページ見たよ!」の目印です。
今回は楽なのでPHPで作りましたが、PerlでもJavaでもRubyでも、お好きにどーぞ。
■test.php(PDFをダウンロードさせる奴)
<?php
//セッション開始
session_start();
if(isset($_SESSION{'flg'}) && $_SESSION{'flg'} == "ok"){
//PDF出力
header("Content-Disposition: attachment; filename=test.pdf");
readfile(dirname(__FILE__) . "/test.pdf");
}else{
print "不正遷移";
}
?>
//セッション開始
session_start();
if(isset($_SESSION{'flg'}) && $_SESSION{'flg'} == "ok"){
//PDF出力
header("Content-Disposition: attachment; filename=test.pdf");
readfile(dirname(__FILE__) . "/test.pdf");
}else{
print "不正遷移";
}
?>
は、セッションを参照して「flg」に「ok」が設定してあれば、
つまり「test_before.php」を経由していればPDFをダウンロードさせます。
「test_before.php」を経由していなければサヨナラです。
そんな感じ(--)ノ
まとめると
1.「.htaccess」で保護したいファイルへの直接アクセスを禁止する
2.保護したいファイルはCGI経由で表示する
3.「2.」のCGIで正規のルートでのアクセスかを(セッションを使ったりなんだりで)チェックする
ってなやり方です。
完了\(--)/