检查curl http命令

时间:2013-01-08 12:41:08

标签: php http unix post curl

你好!

我正在尝试将图片上传自动化到网站,女巫正在使用数据库来跟踪文件。用户界面......好吧,非常糟糕,而且我有很多文件。我无法访问数据库,因此我必须找到解决方法,我发现我可以使用 cURL 轻松模仿网站的上传机制。

我检查了浏览器使用Mozilla的Firebug发送的POST数据,以及该网站上传表单的源代码。我能够确定要发送到服务器的所需POST字段,所以我在PHP中放了一个小的cURL命令。

我使用的是Debian GNU / Linux,以及版本号为5.3.20-1的PHP。 相关代码如下所示:

$strfilepath = '@' .  $item->getPathname();  // get next file from directory (directory iterator)

$postdata = array();

$postdata['upload'] = 1;
$postdata['category_id'] = 43;
$postdata['imgtoupload'] = $strfilepath;
$postdata['actie'] = 1;

curl_setopt($somecurl, CURLOPT_URL, "http://some.site.at.somwhere.com/image_up.php");
curl_setopt($somecurl, CURLOPT_POST, true);
curl_setopt($somecurl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($somecurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($somecurl, CURLOPT_NOPROGRESS, false);
curl_setopt($somecurl, CURLOPT_VERBOSE, true); // FTW!

$response = curl_exec($somecurl);

我想将浏览器的POST命令与我的“artifical”http请求进行比较,所以 我的确切问题是如何获取由cURL生成的POST(或任何其他HTTP)请求?(就像Firebug可以做的那样。) 我唯一能做的就是启用CURLOPT_VERBOSE,但它只返回标题数据。

检查curl_getinfo()和命令行列表的返回我发现服务器发出了302 HTTP警告,并且它没有上传任何文件:

Connection #0 to host some.site.at.somwhere.com left intact

可能认证存在一些问题,但我想确保代码为服务器发送适当的数据。

提前致谢! 真诚地:G。

编辑(13.01.09):

哈!我做到了! 问题是cURL以某种方式覆盖了发送数据的类型。它将图片标记为application/octet-stream而非image/jpeg。 我明确地在“要发送的文件”字段中指定了类型,解决了问题:

 $strfilepath = '@' .  $item->getPathname() . ";type=image/jpeg" ;

它可以正常工作。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

最简单的方法是从命令行使用ngrep

ngrep -W byline host some.site.at.somwhere.com and port 80

将把端口80上some.site.at.somwhere.com的所有流量转储到stdout。您还可以使用-O标志将输出写入pcap文件:

ngrep -O http-traffic.pcap -W byline host some.site.at.somwhere.com and port 80

某些发行版不会在其主存储库中打包ngrep,但tcpdump在这种情况下是一个不错的选择,语法类似:

tcpdump -A -s 1600 host some.site.at.somwhere.com and port 80

并将其发送到文件,而不是:

tcpdump -w http-traffic.pcap -s 1600 host some.site.at.somwhere.com and port 80

请注意,无论您使用哪种工具,表达式host some.site.at.somwhere.com and port 80都是相同的。您可以使用man pcap-filter了解相关信息。