4

你好!

我正在尝试自动将图像上传到站点,女巫正在使用数据库来跟踪文件。用户界面……嗯,很糟糕,而且我有很多文件。我无法访问数据库,所以我必须找到解决方法,我发现我可以使用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 命令与我的“人工”http 请求进行比较,所以我的确切问题是如何获取 cURL 生成的 POST(或任何其他 HTTP)请求?(就像 Firebug 可以做的那样。)我对 curl 唯一能做的就是启用 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" ;

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

4

1 回答 1

0

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

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

这会将所有进出some.site.at.somwhere.com端口 80 的流量转储到标准输出。-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.

于 2013-01-09T13:07:13.760 回答