[PHP-users 34469] Re: フォーム認証によるバイナリファイルへのアクセス制限の方法

安倍 雄一郎 y.abe @ abatous.jp
2009年 3月 26日 (木) 19:09:44 JST


安倍と申します。

PDFを直接アクセスさせずに、PHPから読み込んで返してみてはいかがでしょう?

PDFをapacheからアクセスできない別の場所に設置してPHPから読み込んで返せばうまくいくような気がします。
以下の例では、/pathtopdf/abcd.pdfとしてます。
実際には設置したPDFファイルのパスにしてください。

<?php
session_start();
if (auth() === false) {
  // 認証されてなければログインページへ
  header('Location: 'http://www.example.com/login.php');
} else {
  // ファイルを読み込んで出力
 $size = filesize('/pathtopdf/abcd.pdf');
 header("Expires", gmdate("D, d M Y H:i:s",time() - 3600 * 24 * 365) . " GMT");
 header ("Last-Modified", gmdate("D, d M Y H:i:s") . " GMT");
 header ("Cache-Control", "must-revalidate, post-check=0,pre-check=0");
 header ("Pragma", "private");
 header ("Content-type", "application/octet-stream");
 header ("Content-Disposition", "attachment; filename=abcd.pdf");
 header ("Content-Length", $size);
 $fp = fopen('/pathtopdf/abcd.pdf','rb');
 fpassthru($fp);
 fclose($fp);
}
?>

実際に動かしていないので、エラーがあったらご容赦ください。

以上、よろしくお願いいたします。

> -----Original Message-----
> From: php-users-bounces @ php.gr.jp [mailto:php-users-bounces @ php.gr.jp]
> On Behalf Of Hisamitsu Issei
> Sent: Thursday, March 26, 2009 6:12 PM
> To: PHP-users ML
> Subject: [PHP-users 34468] フォーム認証によるバイナリファイルへのアクセ
> ス制限の方法
> 
> 久光と申します
> 
> 
> http://www.example.com/test/pdf/abcd.pdf
> のpdfファイルがあるとして、フォーム認証をした状態のユー
> ザーだけがこれを閲覧できるようにする方法を探しています
> (URLを直接入力しても閲覧できないようにする)。
> 
> .htaccessに
> RewriteEngine on
> RewriteBase /
> RewriteRule test/pdf/(.*)$ auth_check.php?fn=%{REQUEST_FILENAME} [L]
> と書くことで、指定ディレクトリへのアクセスをいったんauth_check.php
> へ誘導することにしました。
> 
> あとはauth_check.phpの中で認証状態を確認して、認証され
> ていなければログイン用のページへリダイレクト、認証されていれ
> ば元々のアクセス先へリダイレクト、と思ったのですが元々のアク
> セス先へリダイレクトしたら無限ループに入ってしまいます(当た
> り前ですよね)。
> 
> <?php
> session_start();
> if (auth() === false) {
>   // 認証されてなければログインページへ
>   header('Location: 'http://www.example.com/login.php');
> } else {
>   // 認証されていたら元のアドレスへ戻す
>   header('Location: 'http://www.example.com/test/pdf/abcd.pdf');
> }
> ?>
> 
>  単純に元のアドレスへリダイレクトせずにphpであと一工夫
> 加えれば解決できるのか、根本的に違う方法(phpとは関係ない方
> 法)が必要なのかがわかりません。よろしくお願いいたします。
> 
> 
> 
> 
> 
> 
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3




PHP-users メーリングリストの案内