当前位置:首页 > PHP

php 实现防盗链

2026-02-28 03:02:20PHP

防盗链的基本概念

防盗链(Hotlink Protection)用于防止其他网站直接引用本网站的图片、视频等资源,避免流量和带宽被恶意消耗。PHP可通过多种方式实现防盗链功能。

检查HTTP Referer

通过检查HTTP请求头中的Referer字段,判断请求是否来自合法域名。若Referer不匹配预设的合法域名,则拒绝访问。

$allowedDomains = ['example.com', 'trusted-site.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$isValidReferer = false;

foreach ($allowedDomains as $domain) {
    if (strpos($referer, $domain) !== false) {
        $isValidReferer = true;
        break;
    }
}

if (!$isValidReferer) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access denied: Hotlinking not allowed.');
}

生成动态访问令牌

为资源链接添加动态令牌(如时间戳或哈希值),验证请求时检查令牌的有效性。

$secretKey = 'your-secret-key';
$expireTime = time() + 3600; // 1小时有效期
$filePath = '/path/to/resource.jpg';
$token = hash_hmac('sha256', $filePath . $expireTime, $secretKey);

// 生成访问链接  
$accessUrl = "download.php?file=" . urlencode($filePath) . "&expire=$expireTime&token=$token";

验证令牌的示例:

$secretKey = 'your-secret-key';
$filePath = $_GET['file'] ?? '';
$expire = $_GET['expire'] ?? 0;
$token = $_GET['token'] ?? '';

if (time() > $expire || $token !== hash_hmac('sha256', $filePath . $expire, $secretKey)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Invalid or expired access token.');
}

// 允许访问文件  
readfile($filePath);

使用.htaccess限制访问

通过Apache的.htaccess文件限制资源访问,仅允许特定域名或IP访问:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://(www\.)?example\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule \.(jpg|png|gif|mp4)$ - [F]

输出图片时添加水印

若检测到非法引用,动态为图片添加水印:

header('Content-Type: image/jpeg');
$image = imagecreatefromjpeg('original.jpg');
$watermark = imagecolorallocate($image, 255, 0, 0);
imagestring($image, 5, 10, 10, 'Stolen Content', $watermark);
imagejpeg($image);
imagedestroy($image);

Nginx防盗链配置

若使用Nginx,可在配置文件中添加规则:

php 实现防盗链

location ~* \.(jpg|png|gif|mp4)$ {
    valid_referers none blocked example.com *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

综合建议

  • 结合Referer检查与动态令牌增强安全性。
  • 对敏感资源使用.htaccess或Nginx规则减少PHP处理压力。
  • 动态生成资源链接时限制有效期,避免长期暴露。

标签: 防盗链php
分享给朋友:

相关文章

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php session实现购物车

php session实现购物车

PHP Session 实现购物车 初始化 Session 确保在使用 Session 前调用 session_start() 函数。通常放在 PHP 文件的最顶部。 <?php sessio…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…

php实现进度条

php实现进度条

PHP 实现进度条的方法 使用 HTML 和 CSS 结合 PHP 实现进度条 在 PHP 中,进度条通常通过 HTML 和 CSS 实现,PHP 负责计算进度并更新前端显示。 <di…

php 实现排名

php 实现排名

PHP 实现排名的方法 在 PHP 中实现排名功能通常涉及对数据进行排序、计算排名以及输出结果。以下是几种常见的实现方式: 基本数组排序排名 $scores = [85, 92, 78, 95, 8…