PHP ファイルアップロードのソースコード分析 (RFC1867) 知りたい人は参考にしてください
HTTP ベースのアップロードは、FTP よりも比較的使いやすく、安全です。この記事では、PUT、WEBDAV、RFC1867 などのアップロード方法を分析します。 PHP で RFC1867 に基づいたファイル アップロードを実装するための
RFC1867
RCF1867 は、HTML 標準プロトコルのフォームベースのファイル アップロードです。
1 type 属性にファイル オプションを追加しました。入力要素の。
2 input タグには、アップロードできるファイル タイプまたはファイル形式のリストを指定できる accept 属性を含めることができます。
さらに、この標準では、新しい MIME タイプ multipart/form-data も定義されており、enctype="multipart/form-data" または を含むファイルを処理する場合、フォームにマークを付けるときに取るべき動作。
たとえば、HTML でユーザーが 1 つ以上のファイルをアップロードできるようにしたい場合は、次のように記述できます:
コードは次のとおりです | コードをコピーします |
このフォームは誰もがよく知っているはずですが、PHP では独自の定義があります。デフォルトのフォーム要素 MAX_FILE_SIZE。ユーザーは、この非表示のフォーム要素を使用して、PHP がアップロードするファイルの最大サイズのみを許可することを提案できます。たとえば、上記の例では、ユーザーがアップロードするファイルが 5000 (5k) を超えないようにすることができます。 ) バイトの場合、次のように記述できます:
コードは次のとおりです | コードをコピー |
ファイルを選択: ファイルの説明: |
この MAX_FILE_SIZE がどれほど信頼できないかは言うまでもありません (したがって、ブラウザベースの制御は信頼できません)。純粋に実装の観点から、この MAX_FILE_SIZE がどのように機能するかをゆっくり紹介します。 out ファイルの説明 (「Laruence の個人紹介」)、アップロードをクリックした後はどうなりますか?
フォーム送信
ユーザーが送信を確認した後、ブラウザは、action 属性で指定されたページに次のような形式のデータ パケットを送信します。フォーム内 (この場合は、upload.php):
コードをコピー | |||||||||||||||||||||||||||||||||
POST /upload.php HTTP/1.0rn ...
|
コードをコピー | |
if ((cd = php_mime_get_hdr_value(header, "Content-Disposition "))) { char *pair=NULL; ++cd; { ++cd; key = php_ap_getword(&pair, '=' ); F if (! Strcasecmp (key, "name") { EFREE (Param); } else if ( !strcasecmp(key, "ファイル名")) {
|
unsigned int value_len;
char *value = multipart_buffer_read_body(mbuff, &value_len TSRMLS_CC);} | |||||||||||||||||||||||||
「はい」の場合、その値に従ってファイル サイズを超えているかどうかを確認します
上記のコードを通して、判定が 2 つの部分に分かれていることもわかります。 、最初の部分は、PHP のデフォルトのアップロード制限を確認することです。2 番目の部分は、ユーザー定義の MAX_FILE_SIZE を確認することです。したがって、フォームで定義されている MAX_FILE_SIZE は、PHP で設定されている最大アップロード ファイル サイズを超えることはできません。 名前とファイル名を判断することで、ファイルアップロードの場合、PHPの設定に従ってファイルアップロードディレクトリにランダムな名前の一時ファイルを作成します:
ファイル ハンドルと一時的なランダム ファイル名を返します。 その後、ファイル名が正当である、名前が正当であるなどの検証。 これらの検証に合格した場合は、内容を読み取り、この一時ファイルに書き込みます。 ...
ループ読み込みが完了したら、一時ファイルハンドルを閉じます。 レコード一時変数名:
このとき、名前を付けてアップロードするとFILE変数が生成されます。設定します:
名前なしのアップロードの場合は、tmp_name を使用して設定します:
最後にupload.phpの処理をユーザーに渡します。 この時点でupload.phpでは、ユーザーはmove_uploaded_fileで生成したばかりのファイルを操作することができます
|