php curl multipart/data-form 每个边界的内容类型
php curl multipart/data-form content-type for each boundary
我想我想知道是否有可能 POST multipart/data-form 内容类型包含 json、文件、txt、xml 在同一个 post。
所以请求看起来像这样:
Content-Type: multipart/form-data; boundary=BOUNDARY
--BOUNDARY
Content-type:application/json
Content-Disposition:form-data
{{"SomeJsonObject":"valueOfObject"}}
--BOUNDARY
Content-type:application/xml
Content-Disposition:form-data
<node>SomeXML Nodes</node>
--BOUNDARY--
我知道我可以将其编码为字符串,手动包含边界,但我想知道是否可以通过
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
谢谢
没有办法 post POST 中的 STRING 数据,除非你自己建立边界但是 curl 可以 post 磁盘中的文件所以
file_put_contents('/tmp/fileForSend.json');
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
'file' =? '@/tmp/fileForSend.json;type=application/json', // this is CURL integrared feature, curl will read file itself
));
所以对于 CURL 来说,放置“@”sybmol 意味着它必须读取文件并将其内容放入 POST 请求
您还可以使用此 hack 将 Content-Type 传递给每个多部分边界:
$url = 'https://...'
$data = ["json\";\nContent-type:\"application/json\";\nContent-disposition:\"form-data" => '{"my":json}',
"xml\";\nContent-type:\"application/xml\";\nContent-disposition:\"form-data" => "<root/>"];
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($resource);
curl_close($resource);
想法是 'inject' 所有必要的 headers 到 "name" 选项,就像在 SQL 注入中一样。
上面的代码将发送包含所有必要内容的多部分请求 headers:
------------------------------b66e31048210
Content-Disposition: form-data; name="json";
Content-type:"application/json";
Content-disposition:"form-data"
{"my":json}
------------------------------b66e31048210
Content-Disposition: form-data; name="xml";
Content-type:"application/xml";
Content-disposition:"form-data"
<root/>
但是要小心,这些东西的记录非常糟糕。
我想我想知道是否有可能 POST multipart/data-form 内容类型包含 json、文件、txt、xml 在同一个 post。 所以请求看起来像这样:
Content-Type: multipart/form-data; boundary=BOUNDARY
--BOUNDARY
Content-type:application/json
Content-Disposition:form-data
{{"SomeJsonObject":"valueOfObject"}}
--BOUNDARY
Content-type:application/xml
Content-Disposition:form-data
<node>SomeXML Nodes</node>
--BOUNDARY--
我知道我可以将其编码为字符串,手动包含边界,但我想知道是否可以通过
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
谢谢
没有办法 post POST 中的 STRING 数据,除非你自己建立边界但是 curl 可以 post 磁盘中的文件所以
file_put_contents('/tmp/fileForSend.json');
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
'file' =? '@/tmp/fileForSend.json;type=application/json', // this is CURL integrared feature, curl will read file itself
));
所以对于 CURL 来说,放置“@”sybmol 意味着它必须读取文件并将其内容放入 POST 请求
您还可以使用此 hack 将 Content-Type 传递给每个多部分边界:
$url = 'https://...'
$data = ["json\";\nContent-type:\"application/json\";\nContent-disposition:\"form-data" => '{"my":json}',
"xml\";\nContent-type:\"application/xml\";\nContent-disposition:\"form-data" => "<root/>"];
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($resource);
curl_close($resource);
想法是 'inject' 所有必要的 headers 到 "name" 选项,就像在 SQL 注入中一样。
上面的代码将发送包含所有必要内容的多部分请求 headers:
------------------------------b66e31048210
Content-Disposition: form-data; name="json";
Content-type:"application/json";
Content-disposition:"form-data"
{"my":json}
------------------------------b66e31048210
Content-Disposition: form-data; name="xml";
Content-type:"application/xml";
Content-disposition:"form-data"
<root/>
但是要小心,这些东西的记录非常糟糕。