web-dev-qa-db-ja.com

生の投稿データを取得する

Phpマニュアルまたはphp:// inputによると、$HTTP_RAW_POST_DATAmultipart/form-dataPOSTリクエストで機能しません。

"php:// inputを使用すると、生のPOSTデータを読み取ることができます。これは、$HTTP_RAW_POST_DATAに代わるメモリ消費量が少なく、特別なphp.iniディレクティブは必要ありません。php://inputはenctype="multipart/form-data"では使用できません。 "

multipart/form-dataフォームの生データを取得するにはどうすればよいですか?

30
Andrey M.

直接の答え:それはできません。 PHPは、multipart/form-data Content-Typeを検出するたびに、それ自体を解析することを主張します。生データは利用できません。悲しいことに。しかし、あなたはそれをハックすることができます。

同様の問題が発生しました。パートナーが誤った形式のデータをmultipart/form-dataとして送信していました。PHPはそれを解析できず、自分で解析できるように提供していませんでした。

ソリューション?私はこれを私のApache confに追加しました:

<Location "/backend/XXX.php">
    SetEnvIf Content-Type ^(multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
    RequestHeader set Content-Type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE
</Location> 

これにより、XXX.phpへの着信リクエストのContent-Typeがmultipart/form-dataからmultipart/form-data-alternateに変更されます。これは、PHPが解析を試みるのをブロックするのに十分です。

この後、php:// inputから生データ全体を読み取り、自分で解析できます。

それは醜いですが、私はより良い、または実際には他の解決策を見つけていません-パートナーに彼らの側を修正するように頼むことを除いて。

NB!ここで説明したことを実行すると、$ _ FILESは空になります。

36
Anti Veeranna

enable_post_data_reading = Off およびPHPはインターセプトしませんmultipart/form-dataデータ。

必要なもの:PHP 5.4

11
gerard

私はこれを完全には実装していませんが、動作するはずです。 Apache conf

SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2
RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE
RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE

Content-Typeapplication/x-httpd-phpに設定すると、PHP本体の解析、および問題Norbert Farkasの報告: "Apacheが送り返しますPHPソースコード"。本文はphp://inputで利用可能であり、実際のコンテンツはX-Real-Content-Typeヘッダーを入力します(そのヘッダーは必要ない場合があります-MULTIPART_CTYPE変数は$_ENVに表示されないようでしたが、新しいヘッダーは表示されました。 )他のすべてのリクエストは通常​​どおり処理する必要があります。

おかげでAnti Veerannaそれのほとんどのために! :)

編集:PS明らかにそれはApache固有のものですが、PHPの他の構成のいくつかでは、もっと簡単な方法があるでしょう。

5
Joey Hewitt