4

ユーザーがリモート URL から画像をコピーまたはダウンロードしたり、コンピューターからファイル (pdf や txt ファイルなどを含む場合があります) をアップロードしたりできるようにしたいと考えています。これを行うために、ホストがサポートしている file_get_contents と curl を試しました。ローカル アップロードでは、php を使用しています。それらは、データを転送する基本的な仕事を行います。ただし、ファイルの内容を検証して、悪意のあるコードの拡散やサーバーへの過度に大きなファイルのロードを回避する最善の方法を見つけようとしています。

多くの場合、ファイルは動的に生成されるため、既知の拡張子で終わることはないため、ファイル拡張子をチェックすることはオプションではなく、セキュリティが不足しています。

ヘッダーから MIME タイプを使用することは 1 つのオプションであり、それを行うためのコードがあります。

$file_info = new finfo(FILEINFO_MIME);  // object oriented approach!
$mime_type = $file_info->buffer(file_get_contents($file));  // e.g. gives "image/jpeg"

switch($mime_type) {
    case "image/jpeg":
        // your actions go here...
}

ただし、明らかに、MIME タイプをスプーフィングするのはそれほど難しくありません。

いくつかの投稿では、ファイルの先頭にあるマジック ナンバーをスニッフィングすることを提案していますが、これらもスプーフィングされる可能性があります。

画像の限られたケースでは、使用できます

$imginfo_array = getimagesize($tempFile); 

私の知る限り、これは pdf やドキュメントなどでは機能しません。

これらの方法を合わせても、あまり堅牢ではないようです。しかし、多くのサイトでは、リモート ファイルのアップロード、ピン留め、またはその他の方法での取得が定期的に許可されており、何らかの方法でセキュリティの問題を管理しています。

curl と file_get_contents と wd のように、セキュリティと検証のベスト プラクティス、およびサーバーに転送する前にファイル サイズとファイル タイプを取得するための他のライブラリやその他の手法に関する提案をいただければ幸いです。

注: .jpg や .gif などの主流の画像形式の転送と、pdf ファイル、doc および docx ファイル、xls ファイル、および同様の一般的な形式のアップロードを許可したいと考えています。

推奨事項とアドバイスをお寄せいただきありがとうございます。

4

1 に答える 1

1

ただし、悪意のあるコードの拡散を避けるために、ファイルの内容を検証する最善の方法を見つけようとしています。

ファイルのアップロードは、PHP エコシステムで排除したい攻撃面の 1 つです。cURL を使用してファイルをダウンロードする場合でも、ユーザーが Web フォームからファイルを送信できるようにする場合でも、ソリューションはあまり変わりません。

リモートでコードが実行される問題を解決するには: Web ルートの外にある一般公開されていないフォルダーにファイルをアップロードし、直接アクセスを許可する代わりに、プロキシ スクリプト (ヒント:readfile()または) を使用してファイルを提供します。file_get_contents()

悪意のあるコードがあっても、Apache/nginx はそれを実行しようとは考えません。

... またはサーバーに過度に大きなファイルをロードする

cURL を使用している場合、これは簡単に実行できます。

于 2017-12-28T18:11:35.260 に答える