49402
小さい会社で顧客向け会員サイト（PHP）の運営管理をしています。

会員向けにそれぞれの会員毎の取引状況が記載されたpdfファイルをダウンロードできる機能を実装しようとしています。

ダウンロードボタンに直にファイルのurlをリンクさせてしまうとファイルの保存パスが分かってしまいます。ファイル名を長い文字数のランダムなものにしてもパスが分かってしますとセキュリティ上かなり問題があり、どうしていいものか思案にくれています。

会員の情報やpdfファイルの紐付けのデータベースはMySQL、使用言語はPHP、セッション管理はサーバーサイドで行っています。

パス名を秘匿して強制ダウンロードさせたり、ある条件が整わないとpdfファイルへアクセスできないといった方法をご教示いただければ助かります。

宜しくお願いします。
CC BY-SA 4.0
2018-10-17T08:52:12.897
49382
2018-10-18T04:32:06.227
30562
question
php mysql security
パス名を秘匿してダウンロードさせるには
可能な限り秘匿するのであればPDFをウェブから切り離してPHPからアクセスできるところにおいてPHP側でPDFを出力するという方法があります。

```

    <?php
    //ここにログイン制御やアクセス制御を追加する
    if ($Auth == false) {
      //認証がNGの場合は404を表示する
      header("HTTP/1.0 404 Not Found");
      exit();
    }
    //認証がOKであればPDFを出力する
    //ファイルはWebからアクセス出来ないけどPHPからアクセスできるところに置く
    $file = '/do/not/access/from/web/test.pdf';
    //ファイル名を取得
    $filename = pathinfo($file)['basename'];
    //ファイルサイズを取得
    $len = filesize($file);
    
    //ファイル情報をHeaderで出力
    header("Content-Type: application/pdf");
    header("Content-Length: {$len}");
    header("Content-Disposition: inline; filename={$filename}");
    
    //ファイルを読み込んで出力
    readfile($file);
    
    exit();
    
```

参考URL  
<https://techacademy.jp/magazine/18298>

なぜ秘匿しなければならないのか、どのくらい秘匿の品質担保するかによってどの程度のレベルの機能がベストが代わると思います。どの方法が良いかはご自身で「求められる要求」と「工数」で見極めてください。
CC BY-SA 4.0
2018-10-18T01:34:56.810
49402
2018-10-18T04:32:06.227
2018-10-18T04:32:06.227
22665
22665
49382
answer