57154
任意ユーザが投稿した(任意のプログラム系の)zipファイルを、PHPで安全にダウンロードする仕組みを作りたいのですが、注意すべきことは何ですか？  
HTML出力の場合は「特殊文字を HTML エンティティに変換」しますが、ダウンロードの場合に該当する処理はありますか？  
例えば、zipファイル形式ではなく、個別ファイルでexe形式以外の拡張子のみokとすれば安全ですか？
CC BY-SA 4.0
2019-08-04T01:57:09.270
57147
2019-08-05T14:07:58.917
7886
question
security
任意ユーザが投稿したzipファイルを安全にダウンロードするには？
サーバーにアンチウイルスソフトをインストールしてアップロードしたコンテンツに対して実行する方法があります。  
定義ファイルも更新が必要になりますし、面倒なので、どうしても必要性がない限りはこういう機能は作らない方がいいです。

Linux用のオープンソースのアンチウイルスソフト  
<http://www.clamav.net/>

単純にダウンロードの実装をしたいなら、以下のようにヘッダーを指定してください。

```

    $filename = 'download.zip';
    $filepath = '/home/user/file.zip';
    header('Content-Type: application/force-download');
    header('Content-Length: '.filesize($filepath));
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    readfile($filepath);
    
```
CC BY-SA 4.0
2019-08-04T05:36:29.243
57154
2019-08-04T05:46:59.417
2019-08-04T05:46:59.417
35356
35356
57147
answer
質問文に主語が無いので何が何だかわからないです。

```

    任意ユーザーが投稿した zip ファイルを　　　ここまでは良い
    PHP で安全にダウンロードする              誰がダウンロードするの？
    
```

サーバー管理者？ アップロードした当人？ リスクがあることを共有済みの会員？  
全く無関係で知識も経験もない第三者？

例えばコンピュータウイルスのサンプルを保存しておきたい・共有したいなんてのは「ウイルス対策チーム」（＝先の例でいう当人、会員）ではありそうな話です。そういう専門家なら安全にダウンロードする手法というのは各人で共有できていそうですし、サーバー側で不要な対策ソフトを入れられてしまうと迷惑です。

逆に zip に危険がありうることを知らない一般人向けのサービスを想定しているならウイルス zip とか [zip
bomb](https://ja.wikipedia.org/wiki/%E9%AB%98%E5%9C%A7%E7%B8%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%88%86%E5%BC%BE)
とかを（攻撃者がアップロードすることを禁ずるのは困難なので）一般人にダウンロードさせない・攻撃者を BAN する、ように対策する必要はありそうです。

「安全」っつか「セキュリティ」ってのは設計そのものなので、案件から分析しないと始まりません。

zip を「ダウンロード→保存」させれば「ダウンロード→自動で開く」よりは安全でしょう。（その後、操作員が展開＋実行させれば同じことですが）んで、一般的な
Web UA (ブラウザのこと) は、リンクに `Content-Disposition: attachment` とあるとき添付ファイルを
**自動的に開かず** ダウンロードしようとします、ってのが @nomlis
の回答ですね。オイラも強く同意します（が、これだけでは終局的なセキュリティの担保にはなりえません）
CC BY-SA 4.0
2019-08-05T01:42:58.670
57168
2019-08-05T05:52:17.613
2019-08-05T05:52:17.613
8589
8589
57147
answer
ユーザーがファイルをアップロード可能な場合、サービスに応じた特定の形式のコンテンツのみを受け入れるようにすべきです。任意のファイルまたはアーカイブをアップロード/ダウンロード可能にすべきではありません。任意のファイルをアップロード/ダウンロード可能なサービスは、リスクを度外視するか、利用者がリスクを認識したうえでしか成立しません。

アンチウイルスソフトは気休め程度の対策にしかなりません。世間に出回っているマルウェア(と似ているもの)は排除できますが、例えば私がいま「特定のファイル(群)を消去する実行ファイル(を含んだzip)」を作ったとして、それはアンチウイルスソフトではたいてい検出できません。

エスケープというのは、「ある文脈において、その文脈を破壊するようなデータを文脈に適した形に変換する」ものです。危険なものを安全にするとか、危険なものを排除する仕組みではありません。HTMLであれば、エンドユーザー入力をもとの文脈を破壊しないようにエスケープすれば元の文脈以上に危険なことにはなりません。ところが任意のバイナリには「元の文脈」が存在しないので、エスケープのしようがありません。
CC BY-SA 4.0
2019-08-05T14:07:58.917
57184
2019-08-05T14:07:58.917
5793
57147
answer