通过访问原始POSTphp://input对于内容类型为多部分/表单数据不起作用的表单


Accessing Raw POST via php://input for forms with Content Type multipart/form-data not working

我们有一个代理PHP脚本,并通过访问POST表单数据

$postPayload = file_get_contents('php://input');

这通常是有效的。

(不使用$_POST的原因是,我们有时会有重复的表单输入名称,PHP会抑制这些名称)

现在我们有一个表格

<form name="form" method="post" 
   action="/script.php" enctype="multipart/form-data">

在这种情况下,file_get_contents('php://input');返回一个空字符串。

它可以用复制

curl 'http://localhost/script.php' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Referer: http://localhost/script.php?commandCode=NO_AUTH_REGIST_OPEN_USER&amp;lang=de' -H 'Origin: http://misumi-europe.com.orange.imi.local' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryk3IVneARm3kqJ0fs' --data-binary $'------WebKitFormBoundaryk3IVneARm3kqJ0fs'r'nContent-Disposition: form-data; name="commandCode"'r'n'r'nNO_AUTH_NEXT'r'n------WebKitFormBoundaryk3IVneARm3kqJ0fs'r'n' --compressed

在这种情况下,我如何访问RAW POST数据?

我能够在.htaccess 中这样修复它

<Files "script.php">
# make post data always available in the proxy
php_flag enable_post_data_reading 0
</Files>

multipart/form-data未发送到php://input,仅限于$_POST。

在php.ini中,您可以设置enable-post-data-reading=off来更改此设置,但$_POST将始终为空。看见http://php.net/manual/en/ini.core.php#ini.enable-数据读取后

您可以使用.htaccess 将其设置为单页

php_value  enable-post-data-reading off

还有一个apache破解:

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

另请参阅:获取原始后期数据