PHP实现防盗链功能的代码实例

Finn
Finn
发布时间:2026-10-14 | 2人浏览过
原创

本文介绍如何使用PHP语言实现基础的网站防盗链功能。通过检查HTTP Referer(引用来源)并对比预设的白名单,可以有效防止外部站点直接链接并盗用本站的资源(如图片、软件包或视频)。该方案适合需要简单控制资源访问权限的场景。

防盗链原理与核心逻辑

防盗链的核心在于验证发起请求的“前一个页面”属于谁。在HTTP协议中,这通常通过 HTTP_REFERER 请求头来实现。服务器端脚本接收该信息后,将其与自己配置的“白名单”域名进行比对。若匹配成功,则允许访问;若为空或不匹配,则视为盗链并进行拦截处理。

第1步:配置基础参数与白名单

首先,定义防盗链失败时的跳转地址以及允许的源站域名列表。在实际部署时,请替换示例中的域名以符合您的实际环境。

  • defaulturl: 盗链尝试被拒绝后的目标地址(通常为404页面或首页)。
  • okaysites: 允许访问资源的域名数组,包括带协议的完整URL。

以下为基础代码结构,包含了必要的注释说明:

<?php
/*
 * PHP防盗链示例代码
 * 用法: 将此文件保存为 dao4.php (或任何后缀)
 * 调用方式: filename?site=1&file=文件名
 */

// 1. 设置盗链后的跳转地址
$ADMIN['defaulturl'] = "http://www.example.com/404.htm";

// 2. 设置白名单(允许的来源域名)
$okaysites = array(
    "http://www.example.com/",
    "http://example.com"
);

// 3. 设置真实文件的存储路径映射 (根据site参数选择路径)
$ADMIN['url_1'] = "http://www.example.com/download/"; 
$ADMIN['url_2'] = ""; // 预留路径

第2步:执行Referer校验逻辑

接下来,获取当前请求的 $_SERVER['HTTP_REFERER'],并通过循环检查是否包含在白名单中。最后根据验证结果决定是重定向到真实资源还是拦截页面。

// 获取引用页面地址
$reffer = $_SERVER['HTTP_REFERER'];

if ($reffer) {
    $is_valid = false;
    // 遍历白名单进行检查
    foreach ($okaysites as $domain) {
        if (stripos($reffer, $domain) !== false) { // 建议使用 stripos 或 parse_url 确保准确性
            $is_valid = true;
            break;
        }
    }
    
    // 获取动态传递的 site 和 file 参数
    $site = isset($_GET['site']) ? $_GET['site'] : '';   
    $file = isset($_GET['file']) ? $_GET['file'] : '';
    
    // 构造对应的下载路径键名
    $path_key = "url_" . $site;
    
    if (!empty($ADMIN[$path_key]) && $is_valid) {
        // 校验通过,重定向到真实下载地址
        header("Location: " . $ADMIN[$path_key] . $file);
    } else {
        // 校验失败,重定向到默认拦截页
        header("Location: " . $ADMIN['defaulturl']);
    }
} else {
    // 没有 Referer 头(通常意味着盗链工具或手动输入),视为非法访问
    header("Location: " . $ADMIN['defaulturl']);
}
?>

第3步:测试调用方法

代码保存后,您可以通过拼接特定参数的URL进行测试。假设该脚本位于 http://www.example.com/dao4.php:

  • 正常访问: 从 http://www.example.com/index.html 点击下载按钮触发链接。
  • 盗链模拟: 在其他无关域名(如 http://other-site.com/page.html)放置指向该下载链接的图片或超链接,点击时将跳转至404页面。
  • 参数格式: ?site=1&file=file.zip,其中 site 对应后台定义的路径编号,file 为目标文件名。

注意事项与优化建议

  1. 安全性增强: 原文代码使用了已废弃的 $HTTP_REFERER 全局变量及 ereg() 函数。现代PHP环境建议使用 $_SERVER['HTTP_REFERER'] 和 preg_match() 或字符串查找函数以提高兼容性和性能。
  2. Referer伪装: 高级爬虫可能伪造或丢失Referer头。对于极高安全需求,建议结合Session、Token机制或私有链接生成算法。
  3. CDN支持: 如果您使用CDN服务,建议在CDN控制台直接配置防盗链规则,这样可以减轻源站压力并更高效地拦截请求。

总结

通过上述PHP代码,您可以快速实现基于域名白名单的基础防盗链功能。这对于保护带宽资源、防止恶意爬取具有一定的积极作用。不过请注意,HTTP Referer机制并非绝对安全,它依赖于客户端正确发送头部信息。在高并发或对安全性要求极高的场景下,建议结合其他技术手段共同防护。

以上就是PHP防盗链代码实例的详细内容,更多关于PHP程序设计的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表