programing

PHP "php://input" vs $_POST

goodsources 2022. 10. 10. 18:33
반응형

PHP "php://input" vs $_POST

는 이 .php://input$_POSTJQuery 아약스안 되는 은 이 하는 것과 글로벌 을 사용하는 입니다.$_POST ★★★★★★★★★★★★★★★★★」$_GET

는 ★★★★★★★★★★★★★★★★★★★.php://input는 콘텐츠 유형에 관계없이 요청의 HTTP 헤더 뒤에 있는 모든 원시 데이터를 반환합니다.

PHP superglobal$_POST다음 중 하나에 해당하는 데이터만 랩합니다.

  • application/x-www-form-urlencoded폼을 위한 ) 또는 (형식을 위한 표준 콘텐츠유형)
  • multipart/form-data 업로드에 (파일 업로드에 사용되는 파일)

이는 사용자 에이전트가 지원해야 하는 유일한 콘텐츠 유형이기 때문입니다.따라서 서버와 PHP는 전통적으로 다른 콘텐츠 유형을 수신할 것으로 예상하지 않습니다(그렇다고 수신할 수 없는 것은 아닙니다).

하면 됩니다.form을 사용하다

POST /page.php HTTP/1.1

key1=value1&key2=value2&key3=value3

그러나 Ajax를 많이 사용하는 경우 이 probaby에는 유형(string, int, bool) 및 구조(array, object)와 보다 복잡한 데이터 교환도 포함되므로 대부분의 경우 JSON이 가장 적합합니다.그러나 JSON 페이로드에 대한 요청은 다음과 같습니다.

POST /page.php HTTP/1.1

{"key1":"value1","key2":"value2","key3":"value3"}

내용은 다음과 같습니다.application/json의 어느 도 언급되어 있지 않다) (PHP)의$_POST-그걸 어떻게 다뤄야 할지 모르는 사람이죠.

데이터가 아직 남아 있기 때문에 래퍼를 통해 액세스할 수 없습니다. 때문에 직접 를 가져와야 .file_get_contents('php://input')(-contractions만 아니라면).

또한 XML 데이터 또는 기타 비표준 콘텐츠유형에 액세스 할 수도 있습니다.

먼저 PHP에 대한 기본적인 진실입니다.

PHP는 HTTP 요청을 처리하기 위한 순수 REST(GET, POST, PUT, PATCH, DELETE)와 같은 인터페이스를 명시적으로 제공하도록 설계되지 않았습니다.

「」, 「」는$_SERVER,$_COOKIE,$_POST,$_GET , , , , 입니다.$_FILES 기능은 일반인의 요구에 매우 유용합니다.

「 」의 $_POST (그리고)$_GET)는 입력 데이터가 PHP에 의해 자동으로 URL 디코딩되는 것입니다.특히 표준 내의 쿼리 문자열 파라미터에 대해서는 이 작업을 수행할 생각도 하지 않습니다.GET 바디 또는 HTTP 바디 데이터.POST탁한한다

기타 HTTP 요구 방식

가 되는 과 그 은 자주 되는 HTTP를 한 많은 방식이 할 수 .PUT,PATCH되지 않음) 및 (Google Apigee에서는 사용되지 않음)DELETE.

PHP가 HTTP를 사용할 때 .POST을 사용하다;-)

하지만, 그러면 더 많은 것을 배울 수 있습니다.

즉, PHP 프로그래밍 지식이 향상되고 JavaScript의XmlHttpRequest오브젝트(일부에서는 jQuery), 이 스킴의 제한을 확인할 수 있습니다.

$_POST할 수 제한하고 있습니다.Content-Type★★★★

  1. application/x-www-form-urlencoded , 그리고.
  2. multipart/form-data

만약 당신이 PHP에 대한 서버에달러_POST superglobal에 나타나고 데이터 값을 보내고 싶그러므로, 당신은 클라이언트 측에 키/값 쌍으로 말했다 데이터를 보내--일반인과 같은 불편한 단계(특히는 URL의 다른 부분 urlencoding의 다른 형태:, 날것으로, 정상을 요구하는지를 알아내기 위해 노력 등이 urlencode야 한다.).

, jQuery 사용자,$.ajax()메서드는 JSON을 서버로 전송하기 전에 URL 인코딩된 키/값 쌍으로 변환합니다.은, 「」라고 하는 설정으로 수 .processData: false$.ajax() 문서를 읽고 Content-Type 헤더에 올바른 미디어 유형을 보내는 것을 잊지 마십시오.

php://입력, 단...

★★★★★★★★를 사용해도php://input$_POST ®POST본문 데이터를 요구합니다.HTTP에서는 동작하지 않습니다.Content-Typemultipart/form-data파일 업로드를 허용할 때 HTML 양식에서 사용하는 내용 유형입니다.

<form enctype="multipart/form-data" accept-charset="utf-8" action="post">
    <input type="file" name="resume">
</form>

따라서에서는 HTTP의 하기 위해 PHP의 HTTP를 사용하고 .POST요청하면 될 입니다.$_POST ★★★★★★★★★★★★★★★★★」filter_input_array(POST),$_FILES , , , , 입니다.php://input HTTP에 하나만 POSTPHP 서 php 。

할 수 .$_POST,filter_input_array(POST) , 「」php://input/XML/YAML 중 로 JSONYAML을 수 filter_input_array(POST) ★★★★★★★★★★★★★★★★★」$_POST.

PHP 매뉴얼: php://input

php://input은 요청 본문에서 원시 데이터를 읽을 수 있는 읽기 전용 스트림입니다.php://input은 enctpe="formart/form-data"와 함께 사용할 수 없습니다.

PHP Frameworks를 복구하시겠습니까?

4 및 등의 PHP 인터페이스를 합니다(Codeigniter 4' Larabel'의 PHP의 경우).IncomingRequest ★★★★★★★★★★★★★★★★★」Request오브젝트)를 상기에 추가합니다.이것이 전문 PHP 개발자들이 원시 PHP 대신 프레임워크를 사용하는 이유입니다.

물론 프로그래밍을 좋아하는 경우 프레임워크가 수행하는 작업을 제공하기 위해 자체 파사드 객체를 고안할 수 있습니다.제가 이 답변을 쓸 수 있었던 것은 이 문제에 대해 시간을 들여 조사했기 때문입니다.

URL 인코딩?뭐야!!!??

일반적으로 HTML 양식을 사용하여 일반 동기 HTTP 요청(페이지 전체가 다시 그려질 때)을 수행하는 경우 사용자 에이전트(웹 브라우저)가 양식 데이터를 대신 URL 인코딩합니다. 를 하여 XmlHttpRequestobject, 데이터를 superglobal에 표시하려면 urlencoded 문자열을 패싱하여 전송해야 합니다.

JavaScript에 대해 얼마나 알고 계십니까? :-)

JavaScript 배열 또는 객체에서 URL 인코딩 문자열로 변환하는 것은 많은 개발자들에게 방해가 됩니다(Form Data와 같은 새로운 API를 사용하더라도).JSON을 보내는 것만으로 클라이언트 코드가 더 효율적입니다.

(윙크, 윙크)를 않습니다.XmlHttpRequest오브젝트 직접, 글로벌 함수, 문자열 함수, 배열 함수, 정규 표현(예: I ;-)을 사용할 수 있습니다.이다. urlencoding은 악몽이다. ;-)

PHP, 무슨 일이야?

PHP의 직관적인 XML과 JSON 처리가 부족하기 때문에 많은 사람들이 흥미를 잃습니다.지금쯤은 PHP의 일부라고 생각하실 겁니다(웃음).

많은 미디어 유형(과거 MIME 유형)

수 .JSON은 YAML로 HTTP로 설정할 수 있습니다.Content-Type머리글

  • 응용 프로그램/xml
  • 응용 프로그램/json
  • application/yaml(IANA에는 공식 명칭이 기재되어 있지 않지만)

IANA에 의해 정의된 미디어 유형(이전 MIME 유형)의 수를 확인합니다.

HTTP 헤더의 를 확인합니다.

php://입력 또는 버스트

스트림을 사용하면, PHP가 세계에 강요한 베이비시터/핸드 홀드 레벨의 추상화를 회피할 수 있습니다. :-) 파워가 있으면, 큰 책임감을 얻을 수 있습니다.

을 통해 php://input몇을 해야 , 해야 .

  1. 올바른 HTTP 메서드가 지정되어 있는지 확인합니다(GET, POST, PUT, PATCH, DELETE 등).
  2. HTTP Content-Type 헤더가 전송되었는지 확인합니다.
  3. Content-Type 이 원하는 미디어 유형인지 확인합니다.
  4. 송신된 데이터가 XML/JSON/YAML 등의 형식이 올바른지 여부를 확인합니다.
  5. 필요한 경우 데이터를 PHP 데이터 유형(array 또는 object)으로 변환합니다.
  6. 이러한 기본 검사 또는 변환하나라도 실패하면 예외를 발생시킵니다.

문자 인코딩은요?

AH, HA! 예, 어플리케이션으로 전송되는 데이터 스트림을 UTF-8로 인코딩하고 싶을 수 있습니다.그런데 그 여부를 어떻게 알 수 있을까요?

두 가지 중대한 문제가 있습니다.

  1. 알 수 .php://input.
  2. 데이터 스트림의 현재 인코딩을 확실히 알 수 없습니다.

먼저 얼마가 있는지 모른 채 스트림 데이터를 처리하려고 합니까?그것은 끔찍한 생각이다.HTTP에만 의존할 수 없습니다.Content-Length스푸핑이 가능하기 때문에 스트림된 입력의 크기에 대한 지침을 제공하는 헤더입니다.

다음 사항이 필요합니다.

  1. 스트림 크기 검출 알고리즘
  2. 응용 프로그램 정의 스트림 크기 제한(Apache / Nginx / PHP 제한이 너무 넓을 수 있음)

스트림의 현재 인코딩을 모르면서 스트림 데이터를 UTF-8로 변환하려고 합니까? 어떻게요?iconv 스트림필터(iconv 스트림필터 예시)에서는 다음과 같은 시작 부호화와 종료 부호화가 필요한 것 같습니다.

'convert.iconv.ISO-8859-1/UTF-8'

따라서 양심적이라면 다음 사항이 필요합니다.

  1. 스트림 부호화 검출 알고리즘.
  2. 동적/런타임 스트림필터 정의 알고리즘(priori의 부호화 시작을 알 수 없기 때문에).

(갱신:'convert.iconv.UTF-8/UTF-8'는 모든 것을 UTF-8로 강제합니다만, iconv 라이브러리가 번역 방법을 모를 가능성이 있는 문자를 고려해야 합니다.즉, 문자를 번역할 수 없을 때 수행할 액션을 정의해야 합니다. 1) 더미 문자를 삽입하고 2) 실패/투 및 예외).

HTTP에만 할 수 .Content-Encoding이는 다음과 같은 압축과 같은 것을 나타낼 수 있습니다.이것은 당신이 iconv에 대해 결정하고 싶은 것이 아닙니다.

Content-Encoding: gzip

따라서 일반적인 순서는 다음과 같습니다.

파트 I: HTTP 요구 관련

  1. 올바른 HTTP 메서드가 지정되어 있는지 확인합니다(GET, POST, PUT, PATCH, DELETE 등).
  2. HTTP Content-Type 헤더가 전송되었는지 확인합니다.
  3. Content-Type 이 원하는 미디어 유형인지 확인합니다.

파트 II: 스트림 데이터 관련

  1. 입력 스트림의 크기를 결정합니다(옵션이지만 권장).
  2. 입력 스트림의 부호화를 결정합니다.
  3. 필요에 따라 입력 스트림을 원하는 문자 인코딩(UTF-8)으로 변환합니다.
  4. 필요한 경우 응용 프로그램 수준의 압축 또는 암호화를 반대로 수행한 다음 4, 5, 6단계를 반복합니다.

파트 III: 관련 데이터 유형

  1. 송신된 데이터가 XML/JSON/YMAL 등의 형식이 올바른지 여부를 확인합니다.

(데이터는 URL 인코딩 문자열일 수 있습니다.이 문자열은 해석 및 URL 디코딩이 필요합니다).

  1. 필요한 경우 데이터를 PHP 데이터 유형(array 또는 object)으로 변환합니다.

파트 IV: 데이터 가치 관련

  1. 입력 데이터를 필터링 합니다.

  2. 입력 데이터의 유효성을 확인합니다.

이제 보이니?

$_POSTsuperglobal은 php.ini로 지정합니다.그러나 스트림을 사용할 때 문자 인코딩을 처리하는 것이 훨씬 직관적이고 효율적입니다.이는 올바른 인코딩을 위해 입력 값을 확인하기 위해 슈퍼글로벌(또는 일반적으로 배열)을 루프할 필요가 없기 때문입니다.

php://input는 데이터의 원시 바이트를 제공할 수 있습니다.POSTED JSON (AJAX POST) 。

이를 위한 기능은 다음과 같습니다.

  /**
   * Returns the JSON encoded POST data, if any, as an object.
   * 
   * @return Object|null
   */
  private function retrieveJsonPostData()
  {
    // get the raw POST data
    $rawData = file_get_contents("php://input");

    // this returns null if not valid json
    return json_decode($rawData);
  }

$_POST어레이는 기존 POST에 의해 제출된 폼의 주요 가치 데이터를 처리할 때 더욱 유용합니다.은, 통상은 「」, 「POST」)인합니다.보통상은application/x-www-form-urlencoded(자세한 것은, http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 를 참조해 주세요).

포스트 데이터가 잘못된 경우 $_POST에는 아무것도 포함되지 않습니다.단, php://input에는 잘못된 형식의 문자열이 있습니다.

예를 들어 파일 업로드를 위한 올바른 포스트 키-값 시퀀스를 형성하지 않고 변수 이름이나 어떤 것도 없이 모든 파일을 포스트 데이터로 덤프하는 일부 Ajax 응용 프로그램이 있습니다.$_POST는 비어 있고 $_FILES도 비어 있으며, php://input에는 문자열로 작성된 정확한 파일이 포함됩니다.

if (strtoupper($_SERVER['REQUEST_METHOD']) != 'POST') {
  throw new Exception('Only POST requests are allowed');
}

// Make sure Content-Type is application/json 
$content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
if (stripos($content_type, 'application/json') === false) {
  throw new Exception('Content-Type must be application/json');
}

// Read the input stream
$body = file_get_contents("php://input");
 
// Decode the JSON object
$object = json_decode($body, true);

사용 방법의 간단한 예

 <?php  
     if(!isset($_POST) || empty($_POST)) { 
     ?> 
        <form name="form1" method="post" action=""> 
          <input type="text" name="textfield"><br /> 
          <input type="submit" name="Submit" value="submit"> 
        </form> 
   <?php  
        } else { 
        $example = file_get_contents("php://input");
        echo $example;  }  
   ?>

언급URL : https://stackoverflow.com/questions/8893574/php-php-input-vs-post

반응형