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
ション: 閉じる.....
同様に、私も簡単に次のように発行できます:
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;
}
?>
同様に、次の phpinput_get.php テスト スクリプトを実行します。これは、フォーム データを送信するための通常の GET メソッドをシミュレートします。
@php /phpinput_get.php
HTTP/1.1 200 OK
日付: 木、08 Apr 2010 07:38:15 GMT
サーバー: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Length: 141
Connection: close
Content-Type: text/html-8
- -------$_GET------
array(2) {
["n"]=> 9) "perfgeeks"
["p"]=>
string(4) "7788"
}
------php://input-- -----------
この時点で、ngrep ツールを使用してキャプチャされた対応する http リクエスト パケットは次のとおりです。
T 192.168.0.8:36775 -> 192.168.0.6 : 80 [AP]
GET /phpinput_server.php?n=perfgeeks&p=7788 HTTP/1.1..
ホスト: 192.168.0.6..接続: close....
によって送信された http リクエストを比較しますPOST メソッド (通常、GET メソッドによって送信されたリクエストでは、エンティティ本文は空です)。同時に、Content-Type と Content-Length は指定されません。ただし、データ http エンティティ本体を強制し、正しい Content-Type と Content-Length を指定した場合、php://input は引き続き http エンティティ本体データを読み取ることができますが、$_GET データは読み取ることができません。
上記の検出に基づいて、次のような要約を行うことができます:
1. Content-Type 値が application/x-www-form-urlencoded の場合、PHP は本文の対応するデータを要求します。 $_POST 配列に埋められるデータは、urldecode() の解析の結果です。 (実際には、Content-Type に加えて、データがフォーム データであることを示す multipart/form-data もあります。これについては後で紹介します)
2、php://input データ。 Content-Type が multipart/form-data ではありません (この条件については後で説明します)。 php://input データは、データの http エンティティ本体部分と一致します。この部分的に一貫したデータの長さは、Content-Length によって指定されます。
3. Content-Type が application/x-www-form-urlencoded で、送信メソッドが POST メソッドの場合にのみ、$_POST データと php://input データが「一致」します (引用符付き)。形式を示します)一貫性がなく、一貫した内容)。そうでなければ、それらは矛盾します。
4、php://input は $_GET データを読み取ることができません。これは、$_GET データが http リクエストの本文部分ではなく、http リクエスト ヘッダーの PATH フィールドに query_path として書き込まれているためです。
これは、xml_rpc サーバーが file_get_contents(‘php://input’, ‘r’) を通じてデータを読み取る理由を理解するのにも役立ちます。 $_POST から読み取るのではなく、xml_rpc のデータ仕様が xml であり、その Content-Type が text/xml であるためです。
php://input は multipart/form-data に遭遇しました
ファイルをアップロードするとき、フォームは次のように記述されます
コードをコピー コードは次のとおりです。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
