PHP中如何通过HTTPS发送自行构造的完整HTTP请求字符串?
在PHP中发送完整自定义HTTP请求字符串的实现方法
可以实现,而且原生TCP/TLS Socket是最适合的方案——它能完全按照你构造的请求内容发送,不会像cURL那样自动解析请求行、修改Host头或覆盖其他参数,完美匹配你测试Host头注入的需求。
核心实现思路
直接建立到目标服务器(localhost.dev)的HTTPS连接,把预先构造好的完整HTTP请求字符串原样发送,再读取服务器返回的响应,和BurpSuite的转发逻辑一致。
完整代码示例
// 构造完整的HTTP请求字符串 $httpMessage = join("\r\n", [ "POST https://www.malicious-domain.com/my/uri/path HTTP/1.1", "Host: localhost.dev", "Accept: application/json", // 如果有请求体,需要添加Content-Length头,比如: // "Content-Length: 18", // "Content-Type: application/json", ]); // 必须添加HTTP协议要求的请求结束标记:两个连续的换行 $httpMessage .= "\r\n\r\n"; // 如果有请求体,在这里追加内容,比如: // $httpMessage .= '{"key": "value"}'; // 建立HTTPS连接(如果是HTTP则用tcp://localhost.dev:80) // 针对自签名证书的测试环境,添加禁用证书验证的上下文 $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ] ]); $socket = stream_socket_client( 'tls://localhost.dev:443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context ); if (!$socket) { die("连接失败: $errstr ($errno)"); } // 发送自定义请求 fwrite($socket, $httpMessage); // 读取服务器响应 $response = stream_get_contents($socket); // 关闭连接 fclose($socket); // 处理或输出响应 var_dump($response);
关键细节说明
- 请求结束标记:必须在请求字符串末尾添加
\r\n\r\n,这是HTTP协议规定的头与体(如果有)的分隔符,没有的话服务器会一直等待请求完成。 - 证书处理:测试环境中如果用自签名证书,需要通过
stream_context_create禁用证书验证,否则连接会失败;生产环境绝对不能这么做。 - 请求体处理:如果你的请求包含POST数据,需要添加
Content-Length和Content-Type头,再把请求体内容追加到$httpMessage末尾。
这种方法完全不会修改你构造的任何请求内容,能精准模拟Host头注入场景,满足测试套件的需求。
内容的提问来源于stack exchange,提问作者Nick Bedford
相关产品推荐
相关产品推荐

