プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、ファイルの直リンクやURL直接入力での参照を禁止する(リファラを見ないやり方)
ファイルへの直リンクやURL欄に直接入力しての参照を禁止する方法です。
「特定のページを経由しないと表示できないようにする」と言った方が正確ですけどね。
ちなみに「PHP」とか書いておいてなんですが、別にPHPである必要性はありません。

単純に直リンクを禁止するだけなら

ファイルの直リンクを禁止する(リファラを見るやり方)

で書いたようなやり方でも良いのですが、もう少し厳密にやりたくてですね。
Aというファイル(今回はPDFとCSVの二種類のファイル)をBというページから
ダウンロードさせたいのですが、それ以外、例えばAへの直リンクや
URLを直接入力してAを参照することを禁止したかったのです。
ついでに書くと、Bは利用規約の画面なので絶対見て欲しい。
それを見ない限りダウンロードさせねーぞ!というのが経緯です。

さて、それではやり方ですが、実際のコードを見た方が手っ取り早いと思うので
サンプルをおいておきますね。

ファイルは

.htaccess(PDF直リンクを拒否するために使用)
test_before.php(利用規約画面)
test.php(PDFをダウンロードさせる奴)
test.pdf(ダウンロードさせるPDF)

の4つが登場します。

中身はそれぞれこんな感じφ(--)

■.htaccess(PDF直リンクを拒否するために使用)
<Files ~ "\.(pdf|csv)$">
deny from all
</Files>

■test_before.php(利用規約画面)
<?php
    //セッション開始
    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 "不正遷移";
    }
?>

■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>

は「拡張子『.pdf』と『.csv』には誰もアクセスすんな!」です。
あくまでhttp経由のアクセスに対しての制限なので、
CGIさんが内部的に参照する分には問題ありませんけどね。

■test_before.php(利用規約画面)
<?php
    //セッション開始
    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 "不正遷移";
    }
?>

は、セッションを参照して「flg」に「ok」が設定してあれば、
つまり「test_before.php」を経由していればPDFをダウンロードさせます。
「test_before.php」を経由していなければサヨナラです。

そんな感じ(--)ノ

まとめると

1.「.htaccess」で保護したいファイルへの直接アクセスを禁止する
2.保護したいファイルはCGI経由で表示する
3.「2.」のCGIで正規のルートでのアクセスかを(セッションを使ったりなんだりで)チェックする

ってなやり方です。

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事