xml-rpc を使用する場合、サーバー側は、$_POST 配列ではなく、主に PHP 入力ストリーム入力を通じてクライアント データを取得します。したがって、ここでは主に php 入力ストリーム php://input
について説明します。
php://input の概要については、PHP 公式マニュアル文書に明確に概要を説明した段落があります。
「php://input を使用すると、生の POST データを読み取ることができます。$HTTP_RAW_POST_DATA に代わるメモリ消費量が少なく、特別な php.ini ディレクティブは必要ありません。 php://input は enctype=”multipart/form では使用できません。」 -データ”.
翻訳すると、次のようになります:
"php://input は未処理の POST データを読み取ることができます。$HTTP_RAW_POST_DATA と比較してメモリへの負担が少なく、特別な php.ini 設定は必要ありません。php://input は enctype=multipart/form-data には対応できません。"
この概要をどう理解すればいいのか!? 3つのパートに分けて段階的に理解していきました。
1. POSTデータの読み込み
2. multipart/form-data 型には使用できません
3. php://input VS $HTTP_RAW_POST_DATA
POSTデータの読み込み
PHP を使用する場合は、組み込み変数 $_POST についてよく知っている必要があります。 $_POST と php://input の関係と違いは何ですか? また、クライアントがサーバーと対話するために最も一般的に使用されるメソッドは、POST に加えて GET です。 php://input は PHP の入力ストリームとして機能するので、GET データを読み込むことができますか?これら 2 つの質問が、このセクションで説明する必要がある主な内容です。
経験上、テストと観察から要約することは非常に効果的な方法であることがわかっています。ここでは、テストに役立つスクリプトをいくつか書きました。
@file 192.168.0.6:/phpinput_server.php 受信したデータを出力します
@file 192.168.0.8:/phpinput_post.php は、POST メソッド
によるフォーム データの送信をシミュレートします。
@file 192.168.0.8:/phpinput_xmlrpc.php は、POST メソッドを使用した xmlrpc リクエストの発行をシミュレートします。
@file 192.168.0.8:/phpinput_get.php は、GET メソッド
を使用したフォーム番号の送信をシミュレートします。
phpinput_server.php と phpinput_post.php
//@ファイル phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r');
echo "------$_POST-------";
echo var_dump($_POST) . "n";
echo "----------php://input---------------n";
echo $raw_post_data . "n";
?>
//@ファイル phpinput_post.php
$http_entity_body = 'n=' .urldecode('perfgeeks') .urldecode('7788');
$http_entity_type = 'application/x-www-form-urlencoded';
$http_entity_length = strlen($http_entity_body);
$host = '192.168.0.6';
$ポート = 80;
$path = '/phpinput_server.php';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
fputs($fp, "POST {$path} HTTP/1.1rn");
fputs($fp, "ホスト: {$host}rn");
fputs($fp, "Content-Type: {$http_entity_type}rn");
fputs($fp, "Content-Length: {$http_entity_length}rn");
fputs($fp, "接続: より近いnrn");
fputs($fp, $http_entity_body . "rnrn");
while (!feof($fp)) {
$d .= fgets($fp, 4096);
}
fclose($fp);
echo $d;
}
?>
ngrep ツールを使用して http リクエスト パケットをキャプチャできます (検出する必要があるのは php://input であるため、ここでは http リクエスト パケットのみをキャプチャします)。テストスクリプトphpinput_post.phpを実行してみます。