2009-09-01 109 views
28

根據php手冊和php://既不輸入$HTTP_RAW_POST_DATA也可以使用multipart/form-data POST請求。獲取原始發佈數據

「php:// input允許你讀取原始的POST數據,它是一個不需要任何特殊php.ini指令的內存密集型替代品,php://輸入不適用於enctype="multipart/form-data"

如何獲取multipart/form-data表格的原始數據?

+0

如果是字節計數的緣故,你能不能結合的$ HTTP_RAW_POST_DATA計數字節,任何$ _FILES的字節計數? – karim79 2009-09-01 10:22:38

+0

@ karim79,因爲它不是。 – Pacerier 2015-02-05 11:03:04

回答

34

直接回答:你不能那樣做。只要看到multipart/form-data Content-Type,PHP就堅持自己解析它。原始數據不會提供給您。可悲的是。但是你可以繞過它。

我遇到了類似的問題,合作伙伴發送格式不正確的數據爲多部分/表單數據,PHP無法解析它,並沒有給出它,所以我可以自己解析它。

解決方案?我已將此添加到我的Apache的conf:

<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> 

這將從多部分/格式數據傳入請求的內容類型更改爲XXX.php爲multipart/form-數據替代,這是足以阻止PHP從試圖解析它

在這之後,你終於可以從php://輸入讀取整個原始數據並自己解析它。

這是醜陋的,但我還沒有找到一個更好的或實際上任何其他解決方案 - 沒有要求合作伙伴修理他們的一面。

注意!當你做我在這裏描述的時候,$ _FILES將是空的。

+0

如果我以這種方式替換Content-type標頭,我會在瀏覽器中取回php源代碼。 似乎php引擎不會處理這個請求。 有什麼竅門? 我用不同的頭替換,他們都沒有工作。 – 2011-03-14 17:21:32

+0

似乎它是**可能**用['enable_post_data_reading'](http://stackoverflow.com/a/19710850/632951)做到這一點。 – Pacerier 2015-02-05 12:12:51

+0

@Pacerier - 可能,我的回答是在php 5.4之前寫的 – 2015-02-06 06:23:53

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的解析身體原來的問題,而問題諾伯特·法卡斯報道:「阿帕奇發回PHP源代碼」。然後在php://input上提供正文,並在X-Real-Content-Type標題中顯示真實內容類型。 (這個頭文件可能對你沒有必要 - MULTIPART_CTYPE變量似乎沒有出現在我的$_ENV中,但新的頭文件沒有。)所有其他請求都應該照常處理。

感謝反Veeranna大部分! :)

編輯:P.S.顯然它是Apache特有的,但在PHP的其他一些配置中,可能有更簡單的方法。

9

您可以設置enable_post_data_reading = Off並且PHP不會攔截multipart/form-data數據。

要求:PHP 5.4

+1

有趣。特別是當其他地方的PHP手冊堅持在'multipart/form-data'的情況下不可能獲得原始主體。 – Anshul 2014-05-28 11:16:52

+0

@安靜,手冊是否仍然說明?這本手冊沒有一致的版本。有些頁面是版本X,而其他版本是Z. – Pacerier 2015-02-05 12:06:59

+0

@Pacerier,我仍然認爲它不可能獲得原始的多部分/表單數據。以下所有鏈接均暗示: http://php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data http://php.net/manual/en /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 2015-02-06 11:52:52