web-dev-qa-db-ja.com

ファイルをアップロードする最も安全な方法は何ですか?

私が働いている会社は、最近ホストしているサイトでのヘッダーインジェクションとファイルアップロードのエクスプロイトに遭遇しました。ヘッダーインジェクション攻撃に関する問題を修正しましたが、まだアップロードエクスプロイトを制御できていません。

設計者がサイトの構造にコピーし、いくつかの変数を変更して、すぐに使えるアップロードフォームを用意できる社内で使用するプラグアンドプレイタイプの一連のアップロードスクリプトを設定しようとしています彼らのサイト。公開をできるだけ制限することを検討しています(fopenコマンドとShellコマンドは既にシャットダウンしています)。

私は過去1時間このサイトを検索しましたが、外部の情報源に依存する特定の方法を扱ったさまざまな回答が見つかりました。信頼できる保護方法として使用するのに十分具体的な、スクリプトのみの最適なソリューションは何だと思いますか?また、言語をPHPまたは可能な場合は疑似コードに制限します。

編集:私は自分の答えを見つけました(以下に投稿)。これは、シェルコマンドexec()を使用していますが、スクリプトファイルのアップロードをブロックしている場合(このソリューションは非常にうまく機能します) 、問題が発生することはありません。

37
Stephen Walcher

最良の解決策であるIMHOは、アップロードされたファイルを含むディレクトリを「Web」環境の外に置き、スクリプトを使用してそれらをダウンロード可能にすることです。このように、誰かがスクリプトをアップロードしたとしても、ブラウザから呼び出すことでスクリプトを実行することはできず、アップロードされたファイルの種類を確認する必要はありません。

38
andy.gurin

Hardened-PHP を使用して設定します move_uploaded_file$ _ FILES superglobal を使用してプレーンスクリプトを作成します。最も単純なスクリプト、最も安全です(少なくとも、実行中のPHPバージョン自体と同じくらい安全です)。

1
Vinko Vrsalovic