PHP 中获取和伪造 HTTP_REFERER 的方法与注意事项
在 Web 开发中,HTTP_REFERER 常用于记录用户访问路径或进行简单的防盗链判断。本文将演示如何在 PHP 中读取该变量,如何通过底层 Socket 伪造请求头以隐藏真实来路,并分析因 gzip 压缩导致的抓取乱码问题及解决方案。
结果与目标
理解 HTTP_REFERER 的工作原理,掌握获取来访地址的标准方法,并能通过自定义 HTTP 请求头实现来源伪装,同时解决远程内容抓取时的编码问题。
准备条件
- 已配置好 PHP 运行环境(支持
fsockopen和网络访问)。 - 目标服务器未开启严格的 IP 白名单或验证码拦截。
- 了解基本的 HTTP 请求结构(如
GET,Host,Referer等 Header)。
真实操作顺序
第1步:读取用户的访问来源
目的:判断用户是否通过链接跳转进入当前页面,并输出上一个页面的 URL。
动作:检查超级全局数组 $_SERVER 中的 'HTTP_REFERER' 键值是否存在。
<?php
// 检查 HTTP_REFERER 是否存在
if (isset($_SERVER['HTTP_REFERER'])) {
// 存在,则打印来源地址
print "The page you were on previously was {$_SERVER['HTTP_REFERER']}<br />";
} else {
// 不存在,可能为直接输入网址、书签打开或使用浏览器插件保护隐私
print "You didn't click any links to get here<br />";
}
?>
注意:用户可以直接在地址栏输入 URL、使用书签、或通过某些隐私保护工具访问,此时 HTTP_REFERER 为空,并非一定是“没有点击链接”,需根据业务场景结合其他逻辑判断。
第2步:伪造 HTTP_REFERER 发起请求
目的:模拟用户从指定页面跳转过来,绕过基于来源的简单限制(如防盗链)。
入口:使用 PHP 的 fsockopen 建立 TCP 连接。
动作:手动拼接 HTTP 请求字符串,显式指定 Referer 头。
<?php
$host = '127.0.0.1';
$target = '/2.php';
// 伪造来源地址
$referer = 'https://www.example.com/page';
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr($errno)<br />\n";
} else {
// 构造完整的 HTTP/1.1 请求
$out = "GET $target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Referer: $referer\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
完成状态:成功向服务器发送带有指定 Referer 的请求,且接收方通过 $_SERVER['HTTP_REFERER'] 能读到伪造的地址。
原文有依据的排错:抓取页面乱码问题
在使用 fsockopen 抓取网页内容时,常遇到返回数据乱码的情况。这通常不是因为编码错误,而是因为服务端开启了 Gzip 压缩传输。
现象分析
通过抓包或查看响应头,发现包含以下信息:
Content-Encoding: gzip
Content-Length: 14567
当客户端(如 PHP 脚本)声明了接受 Gzip 压缩但由手动 socket 读取并未解压,或者服务端直接返回压缩流而未正确协商时,原始二进制数据被当作文本输出,导致乱码。
解决方案对比
- 手动 Socket 请求:需要在客户端自行处理
gzip解压(使用gzdecode或相关函数),较为繁琐。 - 使用
file_get_contents:PHP 的file_get_contents在大多数现代环境下能自动识别 Content-Encoding 并进行解压,返回干净的 HTML 文本。
<?php
$host = "www.example.com";
// file_get_contents 自动处理 gzip 解压,适合快速抓取
$html = file_get_contents("http://".$host);
file_put_contents("page_content.html", $html);
echo "Done";
?>
简要总结
以上内容详细介绍了 PHP 中处理 HTTP_REFERER 的核心技巧:从基础的读取判断到深层的 Socket 伪造请求。在实际应用中,需注意浏览器隐私策略对 Referer 传递的影响,以及在抓取资源时务必考虑服务器压缩方式(Gzip)带来的编码差异。以上就是关于 PHP 中获取和伪造 HTTP_REFERER 的详细内容,更多关于 PHP HTTP 协议与网络请求的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









