Php checkcurlhttp命令 你好

Php checkcurlhttp命令 你好,php,http,unix,post,curl,Php,Http,Unix,Post,Curl,我正在尝试将图像自动上传到网站,witch正在使用数据库跟踪文件。用户界面是。。。很糟糕,我有很多文件。我没有访问数据库的权限,所以我必须找到一个解决方法,我发现我可以很容易地用cURL模拟站点的上传机制 我用Mozilla的Firebug检查了浏览器发送的POST数据,以及网站上传表单的源代码。我能够确定发送到服务器所需的POST字段,因此我在PHP中添加了一个小cURL命令 我使用的是Debian GNU/Linux和PHP,版本号为5.3.20-1。 相关代码如下所示: $strfilep

我正在尝试将图像自动上传到网站,witch正在使用数据库跟踪文件。用户界面是。。。很糟糕,我有很多文件。我没有访问数据库的权限,所以我必须找到一个解决方法,我发现我可以很容易地用cURL模拟站点的上传机制

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

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

$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" ;

这是它应该做的。谢谢你的帮助

最简单的方法是从命令行使用
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和端口80
都是相同的。您可以使用
man pcap filter

了解这一点。您是否尝试过
tcpdump
?您可能缺少会话和cookie。网站通常会在允许上传之前使用cookies跟踪用户。没有用户跟踪,任何人都可以向服务器发送任何内容。服务器会话也会过期。如果上传表单很糟糕,请考虑扩展浏览器功能,例如GRASEMONKEY。@ Sean Bright:那就是我正在寻找的!我将收集到的网络流量数据导出到一个日志文件中,以便可以使用WireShark进行分析。非常感谢您。@Sean Bright如果您愿意发布您的解决方案,我会接受它作为正确答案。@anttir-是的,您是对的,我也这么认为,所以我在代码中添加了以下curlopt_uu标记:curlopt_CookiesSession、curlopt_COOKIEJAR、curlopt_COOKIEFILE。可能它会正确处理php会话。谢谢你的提示!