php实现盗链
在 PHP 中实现防盗链(Hotlink Protection)可以通过检查 HTTP Referer 头或生成动态访问令牌来限制资源的非法外链。以下是几种常见的实现方法:
检查 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.');
}
// 允许访问时输出资源
header('Content-Type: image/jpeg');
readfile('protected-image.jpg');
注意:Referer 头可能被伪造或缺失,需结合其他方法增强安全性。
动态令牌验证
为资源链接生成一次性或时效性令牌,仅允许携带有效令牌的请求访问。
$secretKey = 'your-secret-key';
$expireTime = time() + 3600; // 1小时有效期
$token = md5($secretKey . $expireTime . 'resource-path');
// 验证令牌
if (($_GET['token'] ?? '') !== $token || time() > $expireTime) {
header('HTTP/1.1 403 Forbidden');
exit('Invalid or expired token.');
}
// 输出资源
header('Content-Type: application/pdf');
readfile('protected-document.pdf');
Nginx 与 PHP 协作
通过 Nginx 配置直接拦截非法 Referer,减轻 PHP 处理压力。
location ~* \.(jpg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
PHP 仅需处理动态资源验证。
输出替代内容
对盗链请求返回替代内容(如占位图或警告信息)。
if (!str_contains($_SERVER['HTTP_REFERER'] ?? '', 'example.com')) {
header('Content-Type: image/png');
readfile('anti-hotlink-image.png');
exit;
}
关键点:

- 静态资源建议通过 Web 服务器(如 Nginx/Apache)直接配置防盗链。
- 动态资源需结合令牌和会话验证。
- Referer 检查可作为辅助手段,但不可单独依赖。






