2009-09-01 4 views
28

PHP 매뉴얼이나 php : // 입력에 따르면 $HTTP_RAW_POST_DATAmultipart/form-data POST 요청과 작동하지 않습니다.원시 게시물 데이터 가져 오기

"php : // input은 $HTTP_RAW_POST_DATA에 비해 메모리를 많이 사용하지 않으며 특별한 php.ini 지시어가 필요하지 않습니다 .php : // 입력은 enctype="multipart/form-data"과 함께 사용할 수 없습니다."

multipart/form-data 양식의 원시 데이터는 어떻게 얻을 수 있습니까?

+0

그것을 바이트 계산을 위해 인 경우는 $ _FILES의 바이트 수와 $ HTTP_RAW_POST_DATA가의 수를 바이트 결합 할 수 없습니다? – karim79

+0

@ karim79, 그렇지 않습니다. – Pacerier

답변

34

직접 답변 : 할 수 없습니다. PHP는 multipart/form-data Content-Type을 볼 때마다 자체 파싱을 고집합니다. 원시 데이터는 사용할 수 없습니다. 슬프게도. 하지만 당신은 그걸 해킹 할 수 있습니다.

비슷한 문제가 발생했습니다. 파트너가 형식이 잘못된 데이터를 multipart/form-data 형식으로 보내고 있습니다. PHP가 구문 분석 할 수 없어서 파싱하지 않아서 직접 파싱 할 수 있습니다.

해결책? 이것은 PHP를 차단하기에 충분/폼 데이터 대체를 다중 부분에 다중/폼 데이터에서 XXX.php로 들어오는 요청의 콘텐츠 형식이 변경됩니다

<Location "/backend/XXX.php"> 
    SetEnvIf Content-Type ^(multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2 
    RequestHeader set Content-Type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE 
</Location> 

: 내 아파치 conf 파일이 추가 구문 분석을 시도하는 중입니다

이렇게하면 마침내 php : // 입력에서 전체 원시 데이터를 읽고 직접 구문 분석 할 수 있습니다.

보기 흉하게 들지만 실제로는 다른 해결책을 찾지 못했습니다.

NB! 여기서 설명한 내용을 수행하면 $ _FILES는 비어 있습니다.

+0

이 방법으로 Content-type 헤더를 대체하면 브라우저에서 PHP 소스가 반환됩니다. PHP 엔진이이 요청을 처리하지 않는 것 같습니다. 트릭이란 무엇입니까? 서로 다른 머리글 교체를 사용했지만 그 중 아무 것도 작동하지 않았습니다. –

+0

['enable_post_data_reading'] (http://stackoverflow.com/a/19710850/632951)을 통해 **이를 수행 할 수있는 것처럼 보입니다. – Pacerier

+0

@ Pacerier - 가능합니다. 제 대답은 PHP 5.4 이전에 작성되었습니다. –

5

이 기능을 완전히 구현하지는 않았지만 정상적으로 작동하는 것처럼 보입니다. Apache conf에서 :

SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2 
RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE 
RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE 

Content-Typeapplication/x-httpd-php에 몸을 구문 분석 PHP의 원래 문제를 해결하기 위해 표시 설정 및보고 문제 베르트 Farkas 보낸 : "아파치는 PHP 소스 코드를 다시 보냅니다." 본문은 php://input에서 사용할 수 있으며 실제 콘텐츠 형식은 X-Real-Content-Type 헤더에 있습니다. (해당 헤더가 필요하지 않을 수도 있습니다. MULTIPART_CTYPE 변수가 내 $_ENV에 나타나지 않지만 새 헤더가 나타납니다.) 다른 모든 요청은 평소대로 처리해야합니다.

덕분에 대다수는 안티 베란다! :)

EDIT : P.S. 분명히 아파치와 관련된 것이지만, PHP의 다른 설정들 중에는 더 쉬운 방법이있을 수 있습니다.

9

enable_post_data_reading = Off을 설정할 수 있으며 PHP는 multipart/form-data 데이터를 가로 채지 않습니다.

이 필요합니다 : PHP 5.4

+1

흥미 롭습니다. 특히 PHP Manual이 다른 곳에서 주장하는 경우'multipart/form-data '의 경우 원시 몸체를 얻는 것은 불가능합니다. – Anshul

+0

@Anshul, 매뉴얼에 여전히 그 내용이 나와 있습니까? 매뉴얼의 일관된 버전은 없습니다. 일부 페이지는 버전 X이고 다른 버전은 Z 버전입니다. – Pacerier

+0

@Pacerier, 나는 여전히 원시 multipart/form-data를 얻을 수 없다고 생각합니다. 다음 링크는 모두 다음을 제안합니다 : http://php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data http://php.net/manual/ko /ini.core.php#ini.enable-post-data-reading http://php.net/manual/en/wrappers.php.php http://php.net/manual/en/reserved.variables .httprawpostdata.php – Anshul

관련 문제