php教程 php手册 php中php://input的用法详细

php中php://input的用法详细

May 25, 2016 pm 04:43 PM
input 용법

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组,所以,这里主要探讨php输入流php://input.

下面的例子摘取的是wordpress中的一段代码,里面有用到http://input,有需要的可以进一步研究,代码如下:

if (!isset( $HTTP_RAW_POST_DATA ) ) {    
	    $HTTP_RAW_POST_DATA = file_get_contents('php://input');    
	} 
	// fix for mozBlog and other cases where xml isn't on the very first line    
	if ( isset($HTTP_RAW_POST_DATA) )    
	$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
로그인 후 복사

对php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述,如下:

“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.

翻译成中文就是:

“php://input可以读取没有处理过的POST数据,相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置,php://input不能用于enctype=multipart/form-data”.

读取POST数据PHPer们一定很熟悉$_POST这个内置变量,$_POST与php://input存在哪些关联与区别呢?另外,客户端向服务端交互数据,最常用的方法除了POST之外,还有GET,既然php://input作为PHP输入流,它能读取GET数据吗?这二个问题正是我们这节需要探讨的主要内容.

经验告诉我们,从测试与观察中总结,会是一个很凑效的方法,这里,我写了几个脚本来帮助我们测试.

@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

php实例代码如下:

<?php
//@file phpinput_server.php
$raw_post_data = file_get_contents(&#39;php://input&#39;, &#39;r&#39;);
echo "-------$_POST------------------n";
echo var_dump($_POST) . "n";
echo "-------php://input-------------n";
echo $raw_post_data . "n";
?>
<?php
//@file phpinput_post.php
$http_entity_body = &#39;n=&#39; . urldecode(&#39;perfgeeks&#39;) . &#39;&p=&#39; . urldecode(&#39;7788&#39;);
$http_entity_type = &#39;application/x-www-form-urlencoded&#39;;
$http_entity_length = strlen($http_entity_body);
$host = &#39;192.168.0.6&#39;;
$port = 80;
$path = &#39;/phpinput_server.php&#39;;
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
    fputs($fp, "POST {$path} HTTP/1.1\r\n");
    fputs($fp, "Host: {$host}\r\n");
    fputs($fp, "Content-Type: {$http_entity_type}\r\n");
    fputs($fp, "Content-Length: {$http_entity_length}\r\n");
    fputs($fp, "Connection: close\r\n\r\n");
    fputs($fp, $http_entity_body . "\r\n\r\n");
    while (!feof($fp)) {
        $d.= fgets($fp, 4096);
    }
    fclose($fp);
    echo $d;
}
?>
로그인 후 복사

我们可以通过使用工具ngrep抓取http请求包,因为我们需要探知的是php://input,所以我们这里只抓取http Request数据包,我们来执行测试脚本phpinput_post.php,代码如下:

@php /phpinput_post.phpHTTP/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; charset=UTF-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.. 
	  Host: 192.168.0.6..Content-Type: application/x-www-form-urlencoded..Co 
	  ntent-Length: 18..Connection: close....n=perfgeeks&p=7788....
로그인 후 복사

仔细观察,我们不难发现.

1,$_POST数据,php://input 数据与httpd entity body数据是“一致”的

2,http请求中的Content-Type是application/x-www-form-urlencoded,它表示http请求body中的数据是使用http的post方法提交的表单数据,并且进行了urlencode()处理.

我们再来看看脚本phpinput_xmlrpc.php的原文件内容,它模拟了一个POST方法提交的xml-rpc请求,代码如下:

<?php
//@file phpinput_xmlrpc.php
$http_entity_body = "nn   jt_userinfon";
$http_entity_type = &#39;text/html&#39;;
$http_entity_length = strlen($http_entity_body);
$host = &#39;192.168.0.6&#39;;
$port = 80;
$path = &#39;/phpinput_server.php&#39;;
$fp = fsockopen($host, $port, $error_no, $error_desc, 30);
if ($fp) {
    fputs($fp, "POST {$path} HTTP/1.1\r\n");
    fputs($fp, "Host: {$host}\r\n");
    fputs($fp, "Content-Type: {$http_entity_type}\r\n");
    fputs($fp, "Content-Length: {$http_entity_length}\r\n");
    fputs($fp, "Connection: close\r\n\r\n");
    fputs($fp, $http_entity_body . "\r\n\r\n");
    while (!feof($fp)) {
        $d.= fgets($fp, 4096);
    }
    fclose($fp);
    echo $d;
}
?>
로그인 후 복사

同样地,让我们来执行这个测试脚本,代码如下:

@php /phpinput_xmlrcp.phpHTTP/1.1 200 OK 
	Date: Thu, 08 Apr 2010 03:47:18 GMT 
	Server: 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------------- 
	<?xml version="1.0"> 
	<methodcall> 
	   <name>jt_userinfo</name> 
	</methodcall>
로그인 후 복사

执行这个脚本的时候,我们通过ngrep抓取的http请求数据包如下

T 192.168.0.8:45570 -> 192.168.0.6:80 [AP] 
	  POST /phpinput_server.php HTTP/1.1.. 
	  Host: 192.168.0.6..Content-Type: text/html..Content-Length: 75..Connec 
	  tion: close....<?xml version="1.0">.<methodcall>.   <name>jt_userinfo< 
	  /name>.</methodcall>....
로그인 후 복사

同样,我样也可以很容易地发现:

1,http请求中的Content-Type是text/xml,它表示http请求中的body数据是xml数据格式.

2,服务端$_POST打印出来的是一个空数组,即与http entity body不一致了,这跟上个例子不一样了,这里的Content-Type是text/xml,而不是application/x-www-form-urlencoded

3,而php://input数据还是跟http entity body数据一致,也就是php://input数据和$_POST数据不一致了.

我们再来看看通过GET方法提交表单数据的情况,php://input能不能读取到GET方法的表单数据?在这里,我们稍加改动一下phpinput_server.php文件,将$_POST改成$_GET,代码如下:

<?php 
	//@file phpinput_server.php 
	$raw_post_data = file_get_contents(&#39;php://input&#39;, &#39;r&#39;); 
	echo "-------$_GET------------------n"; 
	echo var_dump($_GET) . "n"; 
	echo "-------php://input-------------n"; 
	echo $raw_post_data . "n"; 
	 
	? 
	<?php 
	//@file phpinput_get.php 
	$query_path = &#39;n=&#39; . urldecode(&#39;perfgeeks&#39;) . &#39;&p=&#39; . urldecode(&#39;7788&#39;); 
	$host = &#39;192.168.0.6&#39;; 
	$port = 80; 
	$path = &#39;/phpinput_server.php&#39;; 
	$d = &#39;&#39;; 
	$fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
	if ($fp) { 
	  fputs($fp, "GET {$path}?{$query_path} HTTP/1.1rn"); 
	  fputs($fp, "Host: {$host}rn"); 
	  fputs($fp, "Connection: closernrn"); 
	  while (!feof($fp)) { 
	    $d .= fgets($fp, 4096); 
	  } 
	  fclose($fp); 
	  echo $d; 
	 } 
	
로그인 후 복사

同样,我们执行下一phpinput_get.php测试脚本,它模拟了一个通常情况下的GET方法提交表单数据,代码如下:

@php /phpinput_get.phpHTTP/1.1 200 OK 
	Date: Thu, 08 Apr 2010 07:38:15 GMT 
	Server: Apache/2.2.3 (CentOS) 
	X-Powered-By: PHP/5.1.6 
	Content-Length: 141 
	Connection: close 
	Content-Type: text/html; charset=UTF-8 
	 
	-------$_GET------------------ 
	array(2) { 
	  ["n"]=> 
	  string(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.. 
	  Host: 192.168.0.6..Connection: close....
로그인 후 복사

比较POST方法提交的http请求,通常GET方法提交的请求中,entity body为空,同时,不会指定Content-Type和Content-Length,但是,如果强硬数据http entity body,并指明正确地Content-Type和Content-Length,那么php://input还可是读取得到http entity body数据,但不是$_GET数据.

实践中关于php://input用法总结:

1、只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。

2、PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA

3、只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会,填入的长度,由Coentent-Length指定。

4、Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST。

5、php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini

6、PHP会将PATH字段的query_path部分,填入全局变量$_GET,php://input读取不到$_GET数据,是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分.        
               
               

本文地址:

转载随意,但请附上文章地址:-)

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

JSP 주석의 용도 및 분류 분석 JSP 주석의 용도 및 분류 분석 Feb 01, 2024 am 08:01 AM

JSP 주석 분류 및 활용 분석 JSP 주석은 두 가지 유형으로 구분됩니다. 한 줄 주석: 로 끝나는 코드로 한 줄만 주석을 달 수 있습니다. 여러 줄 주석: /*로 시작하고 */로 끝나는 경우 여러 줄의 코드에 주석을 달 수 있습니다. 한 줄 주석 예 여러 줄 주석 예/**여러 줄 주석입니다*여러 줄의 코드에 주석을 달 수 있습니다*/JSP 주석 사용 JSP 주석을 사용하여 JSP 코드에 주석을 달면 읽기 쉬워집니다.

WPSdateif 함수 사용 WPSdateif 함수 사용 Feb 20, 2024 pm 10:27 PM

WPS는 일반적으로 사용되는 사무용 소프트웨어 제품군이며 WPS 테이블 기능은 데이터 처리 및 계산에 널리 사용됩니다. WPS 테이블에는 두 날짜 사이의 시차를 계산하는 데 사용되는 매우 유용한 함수인 DATEDIF 함수가 있습니다. DATEDIF 함수는 영어 단어 DateDifference의 약어입니다. 구문은 다음과 같습니다. DATEDIF(start_date,end_date,unit) 여기서 start_date는 시작 날짜를 나타냅니다.

C 언어에서 종료 기능을 올바르게 사용하는 방법 C 언어에서 종료 기능을 올바르게 사용하는 방법 Feb 18, 2024 pm 03:40 PM

C 언어에서 종료 기능을 사용하려면 특정 코드 예제가 필요합니다. C 언어에서는 프로그램 초기에 프로그램 실행을 종료하거나 특정 조건에서 프로그램을 종료해야 하는 경우가 많습니다. C 언어에서는 이 기능을 구현하기 위해 exit() 함수를 제공합니다. 이 기사에서는 exit() 함수의 사용법을 소개하고 해당 코드 예제를 제공합니다. Exit() 함수는 C 언어의 표준 라이브러리 함수로 헤더 파일에 포함되어 있습니다. 그 기능은 프로그램 실행을 종료하는 것이며 정수를 취할 수 있습니다.

Python 함수 소개: abs 함수의 사용법 및 예 Python 함수 소개: abs 함수의 사용법 및 예 Nov 03, 2023 pm 12:05 PM

Python 함수 소개: abs 함수 사용법 및 예 1. abs 함수 사용법 소개 Python에서 abs 함수는 주어진 값의 절대값을 계산하는 데 사용되는 내장 함수입니다. 숫자 인수를 허용하고 해당 숫자의 절대값을 반환할 수 있습니다. abs 함수의 기본 구문은 다음과 같습니다: abs(x) 여기서 x는 정수 또는 부동 소수점 숫자일 수 있는 절대값을 계산하기 위한 숫자 매개변수입니다. 2. abs 함수의 예 아래에서는 몇 가지 구체적인 예를 통해 abs 함수의 사용법을 보여줍니다. 예 1: 계산

vue3에서 입력 구성 요소 및 통합 양식 데이터를 캡슐화하는 방법 vue3에서 입력 구성 요소 및 통합 양식 데이터를 캡슐화하는 방법 May 12, 2023 pm 03:58 PM

준비 vuecreateexample을 사용하여 프로젝트를 생성합니다. 매개변수는 대략 다음과 같습니다. 기본 입력을 사용합니다. 기본 입력은 주로 값과 변경 시 동기화되어야 합니다. App.tsx는 다음과 같습니다: import{ref}from'vue';exportdefault{setup(){//username은 데이터 constusername=ref('Zhang San');//입력 상자가 변경되면 데이터 동기화 constonInput =;반환( )=>({

Python 함수 소개: isinstance 함수의 사용법 및 예 Python 함수 소개: isinstance 함수의 사용법 및 예 Nov 04, 2023 pm 03:15 PM

Python 함수 소개: isinstance 함수의 사용법 및 예 Python은 프로그래밍을 보다 편리하고 효율적으로 만들기 위해 많은 내장 함수를 제공하는 강력한 프로그래밍 언어입니다. 매우 유용한 내장 함수 중 하나는 isinstance() 함수입니다. 이 기사에서는 isinstance 함수의 사용법과 예를 소개하고 구체적인 코드 예를 제공합니다. isinstance() 함수는 객체가 지정된 클래스나 유형의 인스턴스인지 여부를 확인하는 데 사용됩니다. 이 함수의 구문은 다음과 같습니다

laravel 입력 숨겨진 필드를 구현하는 방법 laravel 입력 숨겨진 필드를 구현하는 방법 Dec 12, 2022 am 10:07 AM

laravel 입력 숨겨진 필드를 구현하는 방법: 1. 블레이드 템플릿 파일을 찾아 엽니다. 2. 블레이드 템플릿에서 method_field 메서드를 사용하여 숨겨진 필드를 생성합니다. "{{ method_field('DELETE') }} ".

MySQL ISNULL 함수에 대한 자세한 설명 및 사용법 소개 MySQL ISNULL 함수에 대한 자세한 설명 및 사용법 소개 Mar 01, 2024 pm 05:24 PM

MySQL의 ISNULL() 함수는 지정된 표현식이나 열이 NULL인지 여부를 확인하는 데 사용되는 함수입니다. 부울 값을 반환하며, 표현식이 NULL이면 1, 그렇지 않으면 0을 반환합니다. ISNULL() 함수는 SELECT 문이나 WHERE 절의 조건부 판단에 사용할 수 있습니다. 1. ISNULL() 함수의 기본 구문: ISNULL(expression) 여기서 표현식은 NULL인지 또는 NULL인지를 결정하는 표현식입니다.

See all articles