【问题标题】:cURL,WireShark. Setting headers to post data and get xml卷曲,WireShark。设置标题以发布数据并获取 xml
【发布时间】:2018-01-22 23:00:09
【问题描述】:

这是来自 WireShark 的转储:

POST /drm/drm_production_v2.php HTTP/1.1

content-length: 278

content-type: text/xml

User-Agent: UserAgent 1.0

Connection: Keep-Alive

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

host: www.example.com



<methodCall>
  <methodName>aMethod</methodName>
  <params>
    <param>
      <value>
        <base64>dXNlcm5hbWU6cGFzc3dvcmQ=</base64>
      </value>
    </param>
    <param>
      <value>
        <struct/>
      </value>
    </param>
  </params>
</methodCall>

我已将 xml 保存到单独的文件中。这就是我正在做的事情:

<?php

function httpsPost($Url, $xml_data, $headers)
{
   // Initialisation
   $ch=curl_init();
   // Set parameters
   curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
   curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
   curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($ch, CURLOPT_URL, $Url);
   // Return a variable instead of posting it directly
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_USERPWD,"username:password");

   // Activate the POST method
   curl_setopt($ch, CURLOPT_POST, 1) ;
   curl_setopt($ch,CURLOPT_USERAGENT,"UserAgent 1.0"); 
   // Request
   curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
   curl_setopt($ch, CURLOPT_TIMEOUT, 999);

   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

   // execute the connexion
   $result = curl_exec($ch);
   // Close it
   curl_close($ch);
   return $result;
}
$str='username:password';
$auth=base64_encode($str);
$request_file = "./request.xml"; 
$fh = fopen($request_file, 'r'); 
$filesize=filesize($request_file);
echo $filesize;
$xml_data = fread($fh,$filesize);

fclose($fh);    

$url = 'http://www.example.com';

$header = array();
$header[] = "POST /drm/drm_production_v2.php HTTP/1.1";
$header[] = "Content-type: text/xml";
$header[] = "content-length: ".$filesize. "\r\n";
$header[] = "User-Agent: UserAgent 1.0";
$header[] = "Connection: Keep-Alive";
$header[] = "Authorization: Basic ".$auth;
$header[] = "host: www.example.com";


$Response = httpsPost($url, $xml_data, $header);

echo $Response;

?>

它从服务器返回一个“错误请求”。有什么建议吗?

【问题讨论】:

  • 您是否将 Wireshark 日志和 xml 中的 URL 更改为 www.example.com,或者您真的要访问它?
  • 我把它改成了这篇文章。

标签: php curl http-headers wireshark


【解决方案1】:

我的第一个猜测是 content-length 标头后面的额外“\r\n”使服务器认为帖子内容从那里开始。我还会将“content-length”、“Content-type”和“host”更改为“Content-Length”、“Contnet-Type”和“Host”,以防万一。

编辑:那个,还有 Ronald Bouman 的回答。

【讨论】:

    【解决方案2】:

    我认为你的论点

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
    

    不正确。 postfields 选项应该是 URL 编码的名称/值对。来自文档:

    " 这可以作为 urlencoded 字符串传递,例如 'para1=val1&para2=val2&...' 或作为字段名称作为键和字段数据作为值的数组。如果 value 是一个数组,则 Content-Type 标头将设置为 multipart/form-data "

    http://php.net/manual/en/function.curl-setopt.php

    【讨论】:

      【解决方案3】:

      pcap2curl 工具允许将 HTTP 请求的 pcap 文件转换为 cURL。

      但是,如果您想从浏览器重放一些 Web 请求,那么您可以不使用 Wireshark,而是在浏览器中进入 Web 开发人员模式。然后,您转到网络请求视图并右键单击感兴趣的请求,然后,在大多数现代浏览器中,有一个 Copy as cURL 选项,然后您可以将生成的命令粘贴到终端中并使用curl 工具重新运行您认为合适的捕获命令。一些浏览器(例如 Mozilla)还提供在浏览器中编辑和重新发送的选项。

      【讨论】:

        猜你喜欢
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多