ホームページ > バックエンド開発 > PHPチュートリアル > PHP ファイルアップロードの脆弱性の簡単な分析_PHP チュートリアル

PHP ファイルアップロードの脆弱性の簡単な分析_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:11:09
オリジナル
1220 人が閲覧しました

ファイル アップロードの脆弱性は 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の場合

コードをコピー

次に、$_FILES['file']['name'] を使用して、クライアントによってアップロードされたファイルの名前 (パスを除く) を取得します。 $_FILES['file']['tmp_name'] を使用して、サーバーがアップロードされたファイルを保存する一時ファイルのパスを取得します

アップロードしたファイルを保存するフォルダー

PHP はアップロードされたファイルを Web サイトのルート ディレクトリに直接配置しませんが、名前は $_FILES['file']['tmp_name'] の値として保存されます。開発者はこの一時ファイルをコピーする必要があります。ファイルを Web サイトのフォルダーに保存されている場所に移動します。

$_FILES['file']['tmp_name'] の値は PHP によって設定され、元のファイル名とは異なります。開発者は $_FILES['file']['name'] を使用して元のファイルを取得する必要があります。アップロードされたファイルの名前。

ファイルアップロード時のエラーメッセージ

$_FILES['file']['error'] 変数は、ファイルのアップロード時にエラー情報を保存するために使用されます。その値は次のとおりです。

エラー メッセージの値は次のとおりです

UPLOAD_ERR_OK 0 エラーなし
UPLOAD_ERR_INI_SIZE 1 アップロードされたファイルのサイズが php.ini の設定を超えています
UPLOAD_ERR_FROM_SIZE 2 アップロードされたファイルのサイズが HTML フォームの MAX_FILE_SIZE の値を超えています
UPLOAD_ERR_PARTIAL 3 ファイルの一部のみをアップロードします
UPLOAD_ERR_NO_FILE 4 ファイルがアップロードされていません

ファイルアップロードの脆弱性

Web サイト訪問者が写真をアップロードする機能を提供する場合、訪問者がアップロードするのは実際には写真ではなく、指定可能な PHP プログラムである可能性があることに注意する必要があります。画像が保存されているディレクトリが開いているフォルダーである場合、侵入者はアップロードされた PHP ファイルをリモートで実行して攻撃を実行することができます。

簡単なファイルアップロードの例を次に示します:

コードは次のとおりですコードをコピー
//ファイルをアップロードするディレクトリを設定します
$uploaddir = "D:/www/images/";

// ファイルが存在するかどうかを確認します

if (isset($_FILES['file1']))
{
// Web サイトのディレクトリに配置されるファイル名を含むフルパス
$uploadfile = $uploaddir . $_FILES['file1']['name'];
//サーバーに保存されているパスを実際のファイル名に移動します
move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile);
}
?>







この例ではファイルのサフィックスはチェックされず、任意のファイルをアップロードできます。上記の問題を解決するのは非常に簡単です。

コードは次のとおりですコードをコピースイッチ( $extension )

これは、ユーザーがアップロードするタイプ番号またはサフィックス名を制限するために使用されます。これにより、単純なフィルタリングが可能になり、php の直接アップロードが防止されます。しかし、別の例を見てみましょう。

描画ツールを使用して、jpg、gif、png などの新しい画像形式を作成します。先頭は GIF、JPG、または PNG である必要があります。

図に示すように、PHP Web 馬の頭を GIF に書き込みます:

{
ケース「アプリケーション/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 ファイルのアップロードのみ許可されます 再アップロード');

}

コードは次のとおりです コードをコピー


次に、簡単な php アップロード ファイル処理を書きます (急いで何気なく書いたので、美しさはありません):

if($_FILES){
echo '次の $_FILES は間違っています:
';
echo "

";<br>
print_r($_FILES);<br>
echo "
";

echo "以下は間違った getimagesize()
";
echo "

";<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. ファイル名を読み取り、拡張子が範囲内であるかどうかを確認します

2. 生成されるファイル名、ディレクトリ、拡張子を自分で定義します。これはファイル名拡張子から取得できます。 他のすべての値は自分で設定し、上位メモリの内容は読み取られません

3. ファイルを新しいディレクトリに移動します (このディレクトリのアクセス許可は読み取り専用に設定されています)

http://www.bkjia.com/PHPjc/629604.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629604.html技術記事ファイル アップロードの脆弱性は、PHP に存在するものではありません。以前の ASP にもファイル アップロードの脆弱性が存在していました。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート