【发布时间】:2011-07-30 11:38:26
【问题描述】:
我正在寻找一个插入式包含脚本/类,它剖析multipart/form-data 并从中填充$_POST(+raw) 和$_FILES。通常 PHP 会自己做。但是因为自动处理对我来说不够用并且使php://input 无法访问[1] 我可能会使用这样的东西来防止这种情况发生:
RewriteRule .* - [E=CONTENT_TYPE:noparsing/for-you-php]
Does not work. Actual solution requires mod_headers andRequestHeader set...
提取过程可能没有那么复杂。但我宁愿使用经过充分测试的解决方案。最重要的是,我更喜欢使用fgets 进行拆分的实现,并模仿$_FILES 紧密有效地处理。找到二进制有效负载的结尾对我来说似乎相当棘手,特别是当您必须剥离 \r\n 但可能遇到只发送 \n 的客户端时(不允许,但可能)。
我确定存在这样的事情。但我很难用谷歌搜索它。有谁知道一个实现? (PEAR::mimeDecode 可以被破解来处理表单数据,但它会占用内存。)
用例简而言之:需要保留原始字段名称(包括空格和特殊字符)以进行日志记录,但不能始终避免文件上传。
出于装饰目的,这就是 POST 请求的外观:
POST / HTTP/1.1
Host: localhost:8000
Content-Length: 17717
Content-Type: multipart/form-data; boundary=----------3wCuBwquE9P7A4OEylndVx
在\r\n\r\n 序列之后,multipart/ 有效负载如下所示:
------------3wCuBwquE9P7A4OEylndVx
Content-Disposition: form-data; name="_charset_"
windows-1252
------------3wCuBwquE9P7A4OEylndVx
Content-Disposition: form-data; name=" text field \\ 1 \";inject=1"
text1 te twj sakfkl
------------3wCuBwquE9P7A4OEylndVx
Content-Disposition: form-data; name="file"; filename="dial.png"
Content-Type: image/png
IPNG Z @@@MIHDR@@B`@@B;HF@@@-'.e@@@AsRGB@.N\i@@@FbKGD@?@?@? ='S@@@
@@@GtIMEGYAAU,#}BRU@@@YtEXtComment@Created with GIMPWANW@@ @IDATxZl]w|
【问题讨论】:
-
这可能会成为一个赏金问题..
-
能保证multipart中的每个MIME部分都有一个Content-Length吗?我不记得规范是否需要这个。我想它会的。
-
令人遗憾的是规范RFC2388 根本没有提到
Content-Length。虽然我假设大多数当前浏览器都这样做(并且至少使用 base64 编码),但我实际上是在尝试支持更古怪的客户端。 (编辑:不,甚至 Opera 都没有。) -
“$argc”变量不包含原始帖子数据吗?还是空字符串 $_POST['']?为什么说自动处理不足? php://stdio 如何为您工作?
-
@David:对于 POST 请求,
argc和argv都不存在。而php://stdin和php://input是空的。 PHP 在main/rfc1867.c中吸收了完整的 POST 正文。这就是它无法访问的原因。我的问题是前导空格被剥离,许多 ASCII 字符转换为_下划线。