PHP实现防盗链功能的代码实例
本文介绍如何使用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为目标文件名。
注意事项与优化建议
- 安全性增强: 原文代码使用了已废弃的
$HTTP_REFERER全局变量及ereg()函数。现代PHP环境建议使用$_SERVER['HTTP_REFERER']和preg_match()或字符串查找函数以提高兼容性和性能。 - Referer伪装: 高级爬虫可能伪造或丢失Referer头。对于极高安全需求,建议结合Session、Token机制或私有链接生成算法。
- CDN支持: 如果您使用CDN服务,建议在CDN控制台直接配置防盗链规则,这样可以减轻源站压力并更高效地拦截请求。
总结
通过上述PHP代码,您可以快速实现基于域名白名单的基础防盗链功能。这对于保护带宽资源、防止恶意爬取具有一定的积极作用。不过请注意,HTTP Referer机制并非绝对安全,它依赖于客户端正确发送头部信息。在高并发或对安全性要求极高的场景下,建议结合其他技术手段共同防护。
以上就是PHP防盗链代码实例的详细内容,更多关于PHP程序设计的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









