Phpマニュアルまたはphp:// inputによると、$HTTP_RAW_POST_DATA
はmultipart/form-data
POSTリクエストで機能しません。
"php:// inputを使用すると、生のPOSTデータを読み取ることができます。これは、$HTTP_RAW_POST_DATA
に代わるメモリ消費量が少なく、特別なphp.iniディレクティブは必要ありません。php://inputはenctype="multipart/form-data"
では使用できません。 "
multipart/form-data
フォームの生データを取得するにはどうすればよいですか?
直接の答え:それはできません。 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は空になります。
enable_post_data_reading = Off
およびPHPはインターセプトしませんmultipart/form-data
データ。
必要なもの:PHP 5.4
私はこれを完全には実装していませんが、動作するはずです。 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-Type
をapplication/x-httpd-php
に設定すると、PHP本体の解析、および問題Norbert Farkasの報告: "Apacheが送り返しますPHPソースコード"。本文はphp://input
で利用可能であり、実際のコンテンツはX-Real-Content-Type
ヘッダーを入力します(そのヘッダーは必要ない場合があります-MULTIPART_CTYPE
変数は$_ENV
に表示されないようでしたが、新しいヘッダーは表示されました。 )他のすべてのリクエストは通常どおり処理する必要があります。
おかげでAnti Veerannaそれのほとんどのために! :)
編集:PS明らかにそれはApache固有のものですが、PHPの他の構成のいくつかでは、もっと簡単な方法があるでしょう。