当前位置:首页 > 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.');
}

生成动态访问令牌

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

php 实现防盗链

$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访问:

php 实现防盗链

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,可在配置文件中添加规则:

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

综合建议

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

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

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (H…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searc…