You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

关键细节说明

  1. 请求结束标记:必须在请求字符串末尾添加\r\n\r\n,这是HTTP协议规定的头与体(如果有)的分隔符,没有的话服务器会一直等待请求完成。
  2. 证书处理:测试环境中如果用自签名证书,需要通过stream_context_create禁用证书验证,否则连接会失败;生产环境绝对不能这么做。
  3. 请求体处理:如果你的请求包含POST数据,需要添加Content-Length和Content-Type头,再把请求体内容追加到$httpMessage末尾。

这种方法完全不会修改你构造的任何请求内容,能精准模拟Host头注入场景,满足测试套件的需求。

内容的提问来源于stack exchange,提问作者Nick Bedford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:35:25