php://input の概要については、PHP 公式マニュアル文書に明確に概要が説明されている段落があります。
「php://input を使用すると、生の POST データを読み取ることができます。$HTTP_RAW_POST_DATA に代わるメモリ消費量が少なく、特別な php.ini ディレクティブは必要ありません。php://input は使用できません。 enctype="multipart/form-data"。
これは次のようになります。
"php://input は未処理の POST データを読み取ることができます。 $HTTP_RAW_POST_DATA と比較して、メモリへの負担が少なく、特別な php.ini 設定は必要ありません。 enctype=multipart/form-data には php://input は使用できません。
この概要を 3 つの部分に分けて段階的に理解していきます。
POST データを読みます。
multipart/form-data タイプには使用できません
php://input VS $HTTP_RAW_POST_DATA
POST データの読み取り
PHP 使用者は、組み込み変数 $_POST $ に精通している必要があります。 _POST と php://input の関係と違いは何ですか? また、php://input は PHP 入力ストリームであるため、クライアントがサーバーと対話するために最も一般的に使用されるメソッドは GET です。 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
//@file phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r ');
echo "------$_POST------n";
echo var_dump($_POST) "; ";
echo "----------php://input-------------n";
echo $raw_post_data . "n";
? >
//@file phpinput_post.php
$http_entity_body = 'n=' .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_desc, 30);
if ($fp); fputs($fp, "POST {$path} HTTP/1.1rn");
fputs($fp, "ホスト: {$host}rn"); {$http_entity_type}rn ");
fputs($fp, "Content-Length: {$http_entity_length}rn");
fputs($fp, "接続: closenrn");
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
@php /phpinput_post.php
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 03:23:36 GMT
Server: Apache /2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Length: 160
Connection: close
Content-Type: text/html- 8
------$_POST---------------------
array(2) {
["n"]=> string(9) "perfgeeks"
["p"]=> string(4) "7788"
}
------php://input----- -------
n=perfgeeks&p=7788
ngrep を通じてキャプチャされた http リクエスト パケットは次のとおりです:
T 192.168.0.8:57846 -> 192.168.0.6:80 [ AP ]
POST /phpinput_server.php HTTP/1.1..
ホスト: 192.168.0.6..Content-Type: application/x-www-form-urlencoded..Co
ntent-Length: 18.接続: close....n=perfgeeks&p=7788....
注意深く見ると、
1、$_POST データ、php://input データ、および httpd エンティティ本体データが "これは、http リクエスト本文のデータが http の post メソッドを使用して送信されたフォーム データであることを意味します。 urlencode() によって処理されました。
(注: 以下ではプロンプトが表示されない太字の部分に注意してください)。
xml-rpc リクエストをシミュレートするスクリプト phpinput_xmlrpc.php の元のファイルの内容を見てみましょう。 POSTメソッドで送信されます。
//@file phpinput_xmlrpc.php
$http_entity_body = "nn jt_userinfon";
$http_entity_type = 'text/html';
$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);
エコー $d;
}
?>
同样地,让我们来执行这个测试 脚本
@php /phpinput_xmlrcp.php
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 03:47:18 GMT
サーバー: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Length: 154
Connection: close
Content-Type: text/html ; charset=UTF-8
------$_POST---------------
array(0) {
}
------php://input-------------
この脚本を実行するとき、我们通ngrep抓取的http请求データ包如下
T 192.168.0.8:45570 -> 192.168.0.6:80 [AP]
POST /phpinput_server.php HTTP/1.1..
ホスト: 192.168.0.6..Content-Type: text/html..Content-Length: 75..Connect
ション: 閉じる.....
/name>.
同様に、私も簡単に次のように発行できます:
1、http 要求中の Content-Type は text/xml です。http を示します。
2 では、サービス エンド $_POST が印刷されるが、http エンティティの本文とは一致しません。この例では、Content-Type がtext/xml は、application/x-www-form-urlencoded
3 ではなく、php://input データも、http エンティティ本体データと一致します。つまり、php://input データと $_POST データは一致しません。
我们稍加改一下phpinput_server.php文件,将$ _POST 変更 $_GET。
复制代 代以下:
// @file phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r');
エコー「------$_GET------n」;
エコー var_dump($_GET) 。 「ん」;
エコー "------php://input-------------n";
$raw_post_data をエコーします。 「ん」;
?>
//@file phpinput_get.php
$query_path = 'n=' 。 urldecode('perfgeeks') 。 '&p=' 。 urldecode('7788');
$host = '192.168.0.6';
$ポート = 80;
$path = '/phpinput_server.php';
$d = '';
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
fputs($fp, "GET {$path}?{$query_path} HTTP/1.1rn");
fputs($fp, "ホスト: {$host}rn");
fputs($fp, "接続: より近いnrn");
while (!feof($fp)) {
$d .= fgets($fp, 4096);
}
fclose($fp);
エコー $d;
}
?>
コードをコピー コードは次のとおりです。