ファイル アップロードの脆弱性は PHP に存在するものではありません。以前の ASP にもファイル アップロードの脆弱性が存在していました。PHP の簡単な分析を紹介します。ファイルアップロードの脆弱性を解決します。
以下は簡単なファイルアップロードフォームです
コードは次のとおりです | コードをコピー |
php設定ファイルphp.ini、オプションupload_max_filesizeはアップロードできるファイルサイズを指定します、デフォルトは2Mです
$_FILES 配列変数
PHP は変数 $_FILES を使用してファイルをアップロードします。$_FILES は配列です。 test.txt をアップロードすると、$_FILES 配列の内容は次のようになります:
コードは次のとおりです | コードをコピー |
$ファイル 配列 { [ファイル] => 配列 { [名前] = & gt; test.txt // ファイル名以来 ️ [tmp_name] => [エラー] = & gt; // エラー情報
} }
ファイルアップロードボタンのname属性値がfileの場合
|
コードをコピー
コードをコピー | |
//ファイルをアップロードするディレクトリを設定します $uploaddir = "D:/www/images/"; // ファイルが存在するかどうかを確認します
if (isset($_FILES['file1'])) |
コードをコピー | |
{ ケース「アプリケーション/msword」: $extension ='doc'; 休憩 ケース 'application/vnd.ms-excel': $extension ='xls'; 休憩 case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': $extension ='docx'; 休憩 ケース 'application/vnd.ms-powerpoint': $extension ='ppt'; 休憩 ケース「アプリケーション/pdf」: $extension ='pdf'; 休憩 case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': $extension ='xlsx'; 休憩 デフォルト: Die('doc、docx、xls、pdf、ppt ファイルのアップロードのみ許可されます 再アップロード'); } |
コードは次のとおりです | コードをコピー |
if($_FILES){ ";<br> print_r($_FILES);<br> echo ""; echo "以下は間違った getimagesize() ";<br> print_r(getimagesize($_FILES['bug']['tmp_name']));<br> echo ""; 終了します; $fp = fopen($_FILES['bug']['tmp_name'],"r"); $content = fread($fp,filesize ($_FILES['bug']['tmp_name'])); //echo $content アップロードされたソースコードが表示されます } ?> <フォームアクション=""メソッド="ポスト" enctype="multipart/form-data">
|
写真に示すように、不正行為の効果が確認できます。
1 つ目は print_r($_FILES) で、展開された jpg の結果を直接表示します。
次に、php 関数 getimagesize() の結果は gif です (ファイルの先頭の段落に基づいています)。
PHP ではこの問題を解決できませんが、サーバーのディレクトリ権限から操作することはできます。いくつかの解決策を示します。
実際には、いくつかの場所に注目する必要があります。ユーザーはファイルを保存したいと考えており、ファイルの内容によってはユーザーの入力形式と一致しない可能性があります。内容はユーザーの入力形式と一致しない可能性があります。また、トロイの木馬コードが混在している可能性があります。 次に、ユーザーがファイルを保存し、サイト ファイルとは別に認証して、分離を実装できるようにします。
保存ディレクトリと保存ディレクトリを独立させます。ディレクトリの権限は読み取り専用であり、実行できません。
このステップはシステム設計により許可されており、どのファイルを最後に実行しても実行されません。たとえテストを行わなかったとしても、すべてのファイルがここに保存されていれば、システムにセキュリティ上のリスクが生じることはありません。 (ユーザーが保存した反動的な言葉を含む画像がある場合は、別途対処する必要があります)
サーバーの受信値を直接使用しないでください。すべてを検出する必要があります
このタイプは、クライアントから渡されたすべての入力は有害であるという原則と同じであり、それらは直接使用されずに判断される必要があります。特定のディレクトリと特定のファイル名が生成される場合。
ファイル名を使用する最善の方法は、ディレクトリを自分でハードコーディングすることです (受信ディレクトリを読み取らないでください)。ユーザーのファイル名を読み取らずに、自分でファイル名をランダムに生成するのが最善です。ファイル拡張子は、右端の「.」に続く文字です。
上記の 2 つの方法は、2 つの側面からストレージに全体的な制約を課すだけです。
方法 2: ファイル名を保存し、指定したディレクトリに書き込み、ファイル名を自分で生成します。
方法 1: ファイルが正しい場所に書き込まれていることを確認してから、書き込みディレクトリにアクセス許可制御を構成します。これが根本的な原因です。どのようなファイルを保存しても、それを実行する権限はありません。
上記の 2 つの方法を併用すると、ファイルが正しい場所に保存され、アクセス許可を制御できるようになります。 ちなみに、ユーザーが保存したファイルが必要な形式を満たしているかどうかは、ファイルの拡張子を直接チェックして、拡張子が満たされていれば保存が許可されます。 とにかく、実行許可制限が設けられているので、必要に応じてコンテンツをアップロードしなくても問題ありません。 いずれにせよ、実装できなくてもそれほど害はありません。
正しい手順:
1. ファイル名を読み取り、拡張子が範囲内であるかどうかを確認します
3. ファイルを新しいディレクトリに移動します (このディレクトリのアクセス許可は読み取り専用に設定されています)