web-dev-qa-db-ja.com

コードの実行を防ぐためにPHPファイルのアップロードでファイル拡張子を変更しますか?

PHP=ファイルのアップロードでは、ランダムに生成されたファイル名でドキュメントルートの外にファイルを保存し、サーバーに実行不可にするように指示することをお勧めします。 HTTP経由でファイルにアクセスしようとしても実行されません。

ルートの外にそれらを保存し、それらがまったく実行されないようにすることが1つの特定の環境で不可能である場合、ファイル拡張子をスクリプトまたは類似のものとして確実に扱われないものに変更することは役立ちますか?

アップロード後、実際の拡張子はデータベースに保存され、ファイルはsd7dsf9Gd7s8sd9876asd.secureExtensionではなくdangerousScript.phpとしてファイルシステムに保存されます。

これで十分でしょうか?では、どの拡張機能が最適でしょうか?

2
kot

いつでも可能です。たとえば、シェルスクリプトがある場合、その実行をどれほど避けられないかは関係ありません。単純なsh somethingはおそらくそれを実行します。

Virtualhostルートディレクトリの外にある場合、それは確かに良い考えです。最も一般的な攻撃(見た目と異なるものをアップロードし、Webサーバーをだまして実行する)を閉じます。

注:Unixの場合、ファイル拡張子は、OSがそれと何をしなければならないかを決定するにはあまり意味がないため、OSは主にその内容に基づいてそれを決定します。実際にはファイル拡張子もありません(最初のポイントの後は、ファイル名の一部にすぎません)。

確認したい場合:

  • まず、「ネガティブリスト」を使用しないでください。つまり、「すべきでないこと」を指定しないでください。デフォルトでは、すべてを禁止する必要があります。 「できる」という短いリストのポジティブなリストを用意してください。
  • この概念を適用するには、ファイルのcontentsを調べるとよいと思います。たとえば、画像であることがわかっている場合は、その内容を確認し、png、jpegなどのファイルのみを許可します。
  • HTTPベースのファイルアップロードの場合は、アップロードされたファイルのMIMEタイプに制約を挿入することもできますが、忘れないでください。クライアント側で設定されるため、application/png mimeタイプですが、基本的にはphpスクリプトです。

アップロードされたコンテンツが許可されているファイルタイプの短いリストと一致しない場合は、少なくとも部分的に誤解を招くエラーメッセージ(たとえば、「アップロード不可」など)をユーザーに提供し、セキュリティアラームを開始します。

Webサーバーが適切に構成されている場合(つまり、PHPファイル)として任意の拡張子を持つファイルを実行しない場合)、このアプローチはPHPコード実行*)に対して機能します。

拡張子の確認/変更も正しい方法です(Webルートの外にファイルを保存するのに次ぐ)。 mimeタイプのチェックは信頼できません 、複雑で、攻撃者によってバイパスされる可能性があります。

存在しない拡張機能、または指定されたコンテキストで意味のない拡張機能(つまり、.js、.html、.phpなど)を使用する必要があります。多くの場合、拡張子は使用されません。

*少なくともファイルに直接アクセスする。たとえば、ファイルが含まれていて別の場所で実行されている場合でも、コードは実行できます。

1
tim