php实现盗链
PHP实现防盗链的方法
防盗链(Hotlinking Protection)用于防止其他网站直接引用本站资源(如图片、视频、文件等)。以下是几种PHP实现防盗链的方案:
检查HTTP_REFERER
通过检查$_SERVER['HTTP_REFERER']判断请求来源是否合法。若来源非允许的域名,则拒绝访问或返回错误。
$allowedDomains = ['example.com', 'trusted-site.com'];
$referer = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
if (!in_array($referer, $allowedDomains)) {
header('HTTP/1.1 403 Forbidden');
exit('Access denied - Hotlinking not allowed');
}
动态生成资源链接
使用PHP脚本动态输出资源,而非直接暴露静态文件URL。每次请求时验证权限。
$filePath = '/path/to/secret-image.jpg';
if (userHasAccess()) { // 自定义权限验证逻辑
header('Content-Type: image/jpeg');
readfile($filePath);
} else {
header('HTTP/1.1 403 Forbidden');
}
使用Token验证
为资源URL添加时效性Token参数,服务器端验证Token有效性。
$secretKey = 'your-secret-key';
$expires = time() + 3600; // 1小时有效期
$token = md5($secretKey . $expires . $requestedFile);
// 生成的URL格式:/file.jpg?token=XXX&expires=XXX
Nginx/Apache配合PHP
通过Web服务器规则实现高效防盗链,例如Nginx的valid_referers指令:
location ~* \.(jpg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
替代内容展示
对于图片资源,可检测盗链后返回替代图片(如提示版权信息的水印图)。

if (isHotlinking()) {
header('Content-Type: image/jpeg');
readfile('watermark.jpg');
exit;
}
注意事项
HTTP_REFERER可能被伪造或缺失,需结合其他方法增强安全性- 动态资源输出会增加服务器负载
- 对于CDN资源需额外配置CDN端的防盗链规则
- 大规模文件建议使用服务器模块(如mod_rewrite)优化性能






