1。ファイルアップロード
クライアントのユーザーがファイルをアップロードするには、ユーザーインターフェイスにフォームを提供して、ファイルをアップロードするリクエストを送信する必要があります。アップロードされたファイルは特別なデータであるため、他の投稿データとは異なり、フォームの特別なエンコードを設定する必要があります。
コードを次のようにコピーします
これはしばしば無視されるため、上記のenctype属性に精通していない可能性があります。ただし、HTTP POSTリクエストに通常のデータとファイルのようなデータの両方が含まれている場合、この属性を追加する必要があります。これにより、さまざまなブラウザの互換性が向上します。
次に、フォームにフィールドを追加して、ファイルをアップロードする必要があります。
次のようにコードをコピーします。<入力タイプ= "ファイル" name = "添付ファイル">
上記のファイルフィールドは、さまざまなブラウザで異なる動作をする場合があります。ほとんどのブラウザの場合、上記のフィールドはブラウジングボタンを備えたテキストボックスにレンダリングされます。このようにして、ユーザーは自分でテキストボックスにファイルパスを入力するか、ブラウジングボタンを介してローカルハードディスクからアップロードするファイルを選択できます。ただし、AppleのSafariでは、ブラウジングのみを使用できるようです。もちろん、このアップロードボックスのスタイルをカスタマイズして、デフォルトのスタイルよりもエレガントに見えるようにすることもできます。
以下に、ファイルのアップロードを処理する方法をより適切に説明するために、完全な例を挙げてください。たとえば、次のフォームを使用すると、ユーザーはローカルサーバーに添付ファイルをアップロードできます。
次のようにコードをコピーします。<p>添付ファイルをアップロードしてください:</p>
<form action = "upload.php" method = "post" enctype = "multipart/form-data">
<入力型= "ファイル" name = "添付ファイル">
<入力タイプ= "submit" value = "添付ファイルをアップロード">
</form>
ヒント:php.iniのupload_max_filesizeを介してファイルをアップロードできる最大値を設定できます。さらに、アップロードできる最大フォームデータを設定するために使用できるPOST_MAX_SIZEもあります。このフィールドを設定します。ただし、前者は後者のフォームデータの一部に属しているため、後者の値は前者よりも大きくなければならないことに注意してください。
図1。Firefoxに示されているアップロードフォーム
このフォームが送信されると、httpリクエストがupload.phpに送信されます。 upload.phpで使用できる特定の情報を表示するために、upload.phpで印刷しました:
コードコピーは次のとおりです。
ヘッダー( 'content-type:text/plain');
print_r($ _ files);
上記のフォームを介してブログのロゴをwww.360weboy.me/upload.phpにアップロードすると、実験をしましょう。
次のようにコードをコピーします:配列
(
[添付ファイル] =>配列
(
[name] => boy.jpg
[type] => image/jpeg
[tmp_name] => d:/xampp/tmp/php1168.tmp
[エラー] => 0
[サイズ] => 11490
))
))
上記は、ファイルがアップロードされた後のグローバル配列に現在アップロードされているファイルに関するすべての情報です。ただし、この情報が安全であることを確認できます。名前やその他の情報が改ざんされている場合はどうでしょうか?私たちは常にクライアントからの情報について警戒する必要があります!
特定のHTTP要求の各部分
ファイルのアップロードをよりよく理解するには、クライアントが送信したHTTPリクエストに含まれる特定の情報を確認する必要があります。以前にアップロードした添付ファイルはこのブログのロゴでした。なぜなら、それは写真だから、上記の実験を行うのに適していないからです。そこで、次のコンテンツを含むtest.textテキストファイルを再度アップロードしました。
コードコピーは次のとおりです。
360W
360日
ウェブボーイの生活
わかった。次に、このテキストファイルをアップロードして、upload.phpに出力します:
コードコピーは次のとおりです。
配列
(
[添付ファイル] =>配列
(
[name] => test.txt
[type] =>テキスト/プレーン
[tmp_name] => d:/xampp/tmp/php51c0.tmp
[エラー] => 0
[サイズ] => 40
))
))
関連するブラウザから送信されたHTTP POSTリクエストを見てみましょう(オプションのヘッダーを省略しました)。
コードコピーは次のとおりです。
post /upload.php http /1.1
ホスト:www.360weboy.me
参照者:http://www.360weboy.me/
MultiPart/form-data; -------------------------------------------------------------- ------------------------------
コンテンツレングス:234
--------------------------------------------- 24464570528145
コンテンツ拡張:form-data;
コンテンツタイプ:テキスト/プレーン
360weboy
360日
ウェブボーイの生活
-------------------------------------- 24464570528145-
上記のリクエスト形式、名前、ファイル名、およびコンテンツタイプのフィールドがありますtest.txt、およびアップロードされたファイル形式のテキスト/プレーン(テキストファイルを表します)。次に、次の行がアップロードされたファイルの特定のコンテンツであることがわかります。
2。安全性の強化
ファイルアップロードのセキュリティを強化するには、$ _FilesグローバルアレイのTMP_NAMEとサイズを確認する必要があります。 TMP_NAMEによって指摘されたファイルが、 /etc /passwdのようなものを指すのではなく、クライアントのユーザーによってアップロードされたファイルであることを確認するために、PHPの関数is_uploaded_file()を使用して次の判断を下すことができます:
コードコピーは次のとおりです。
$ filename = $ _files ['attachment'] ['tmp_name'];
if(is_uploaded_file($ filename)){
/ *アップロードされたファイルです。
}
場合によっては、ユーザーがファイルをアップロードした後、正常にアップロードされたファイルのコンテンツが表示のためにユーザーに表示される場合があるため、上記のコードのチェックは特に重要です。
チェックすべきもう1つのことは、上記のupload.phpの出力配列のタイプフィールドであるアップロードファイルのMIMEタイプです。 最初の例でアップロードしたのは画像であるため、$ _files ['attachment'] ['type']の値は「画像/jpeg」です。 イメージ/PNG、画像/jpeg、画像/gif、画像/x-png、イメージ/p-jpegなどのMIMEタイプの画像のみをサーバー側に受け入れる場合は、次のようなコードを使用してチェックできます。 (それを見てください)例、エラーなどの特定のコードは、システムのメカニズムに従う必要があります):
コードコピーは次のとおりです。
$ aopt_mimes = array(
'image/png'、
'image/x-png'、
'image/gif'、
'image/jpeg'、
「画像/pjpeg」
);
$ image = $ _files ['attachment'];
if(!in_array($ image ['type']、$ allow_mimes)){
die( '申し訳ありませんが、アップロードしたファイル形式は不正確です。画像ファイルのみを受け入れます。');
}
//アップロードされた画像ファイルを処理し続けます
ご覧のとおり、ファイルのMIMEタイプがサーバー側の要件を満たしていることを確認しました。ただし、悪意のあるユーザーが他の有害ファイルのアップロードを防ぐだけでは不十分です。これは、悪意のあるユーザーがこのMimeタイプに偽装されるふりをすることができるためです。 たとえば、ユーザーはJPG画像を作成し、写真のメタデータに悪意のあるPHPコードを書き、PHPという名前の接尾辞を備えたファイルとして保存しました。この悪意のあるファイルがアップロードされると、サーバー側によってMIMEタイプが写真と見なされ、内部の危険なPHPコードが実行されます。特定の画像のメタデータは、次のものと似ています。
コードコピーは次のとおりです。
ファイル名:image.jpg
ファイルサイズ:182007バイト
ファイル日付:2012:11:27 7:45:10
解決策:1197 X 478
コメント:passthru($ _ post ['cmd']);
PHPコードが画像メタデータのコメントフィールドに追加されていることがわかります。したがって、同様の危険な状況を防ぐためには、アップロードされたファイルの拡張の必要なチェックも実行する必要があることは明らかです。次のコードは、MIMEタイプをチェックするための以前のコードを強化します。
コードコピーは次のとおりです。
$ aopt_mimes = array(
'image/png' => '.png'、
'image/x-png' => '.png'、
'image/gif' => '.gif'、
'image/jpeg' => '.jpg'、
'image/pjpeg' => '.jpg'
);
$ image = $ _files ['attachment'];
if(!array_key_exists($ image ['type']、$ aopt_mimes)){
die( '申し訳ありませんが、アップロードしたファイル形式は不正確です。画像ファイルのみを受け入れます。');
}
//省略された接尾辞名でファイル名を取得します:
$ filename = substr($ image ['name']、0、strpos($ image ['name']、 '。'));
//接尾辞名を追加します
$ filename。= $ awtol_mimes [$ yima ['type']];
//アップロードされたファイルを処理し続けます
上記のコードを介して、アップロードされた画像メタファイルにPHPコードが含まれている場合でも、画像ファイルが接尾辞名と画像形式のファイルとして変更され、その中のPHPコードが実行されないことを確認します。上記のコードは、通常のアップロードされた画像にマイナスの影響を与えません。
セキュリティチェックを改善するための上記のいくつかの手順を実行した後、アップロードされたファイルを指定されたディレクトリに保存するだけの場合、PHPのデフォルトの関数ムープ_uploaded_fileを使用して、それを実装できます。
コードコピーは次のとおりです。
$ TMP_FILENAME = $ _FILES ['Attachment'] ['tmp_name'];
$ filename = '/path/to/attachment.txt';
if(move_uploaded_file(tmp_filename、$ filename)){
/ * $ TEMP_FILENAME一時的なディレクトリに保存されたアップロードファイルは、対応するディレクトリの添付ファイルに正常に保存します。
}
また、アップロードされたファイルのサイズを制限する必要がある場合があるため、Filesize関数を使用してアップロードされたファイルのサイズを取得し、判断を下し、これは自分で処理することはできません。
さて、今のところこれをファイルのアップロードについて書いてみましょう。この紹介記事があなたに役立つことを願っています。