使用file_get_contents发送HTTP GET请求失败,经BurpSuite代理却成功的原因
file_get_contents请求失败但Burp代理能成功的原因分析
以下是几种常见的原因,结合你的代码逐一排查:
URL不完整:你代码里的
$url = 'api'是相对路径,而Burp里发送的肯定是完整的绝对URL(比如https://目标域名/api)。PHP的file_get_contents处理相对路径时,会以当前运行脚本的域名/路径为基准,和Burp的请求目标完全不同,自然会失败。请求头缺失或不一致:虽然你加了User-Agent和Accept,但Burp发送的成功请求里可能还有其他必要头没被你包含,比如Cookie、Referer、Accept-Encoding(gzip压缩)等。有些服务器会严格校验请求头的完整性,缺少就会拒绝服务。另外要注意,PHP的header数组里每个头必须是完整的键值对,不能有多余的换行或空格。
HTTP版本、超时等配置差异:
- 你没指定HTTP版本,PHP默认可能用HTTP/1.0,而Burp默认用HTTP/1.1,部分服务器只支持1.1及以上版本;
- 代码里没有设置超时时间,PHP默认超时较短,可能请求还没完成就被中断,而Burp的超时设置更长。
SSL/TLS握手差异:虽然你关闭了证书验证,但PHP的openssl扩展可能默认不支持服务器要求的TLS版本(比如TLS 1.2或1.3),导致握手失败,而Burp会自动适配服务器支持的TLS版本。
URL编码问题:如果目标URL包含特殊字符(比如中文、空格),
file_get_contents可能没有自动编码,而Burp会自动处理URL编码,导致请求的资源路径错误。
排查建议
- 把
$url改成完整的绝对URL,比如https://your-target-domain.com/api; - 在Burp里复制成功请求的所有请求头,全部加到PHP的
header数组中; - 在
http配置数组中添加:'protocol_version' => '1.1', 'timeout' => 30, // 设置30秒超时 - 检查PHP的openssl扩展配置,确保支持服务器要求的TLS版本(可以用
phpinfo()查看OpenSSL相关信息); - 如果URL有特殊字符,先用
urlencode()处理后再请求。
你的代码
$url = 'api'; $options = array( 'http' => array( 'method' => 'GET', 'header' => array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Accept: */*' ), 'ignore_errors' => true, 'proxy' => 'tcp://127.0.0.1:8080', 'request_fulluri' => true, 'verify_peer' => false, 'verify_peer_name' => false, ), ); $context = stream_context_create($options); $response = file_get_contents($url, false, $context); $headers = implode("\n", $http_response_header); echo "Response headers:\n" . $headers . "\n"; echo "Response body:\n" . $response . "\n"; ?>
内容的提问来源于stack exchange,提问作者d33panshuraj
相关产品推荐
相关产品推荐

