PHP 中获取和伪造 HTTP_REFERER 的方法与注意事项

周予安
周予安
发布时间:2026-10-14| 6人浏览过
原创

在 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 读取并未解压,或者服务端直接返回压缩流而未正确协商时,原始二进制数据被当作文本输出,导致乱码。

解决方案对比

  1. 手动 Socket 请求:需要在客户端自行处理 gzip 解压(使用 gzdecode 或相关函数),较为繁琐。
  2. 使用 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 协议与网络请求的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。