当前位置:首页 > PHP

php 实现防盗链

2026-02-14 04:00:06PHP

PHP 实现防盗链的方法

防盗链(Hotlink Protection)用于防止其他网站直接引用你的资源(如图片、视频等),从而减少服务器带宽消耗。以下是几种常见的PHP实现方法:

检查 HTTP Referer

通过检查请求头中的 HTTP_REFERER 字段,判断请求是否来自允许的域名。如果不符合条件,则拒绝访问或返回错误提示。

php 实现防盗链

$allowedDomains = ['example.com', 'sub.example.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';

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

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

动态生成资源链接

通过PHP脚本动态生成资源链接,并在每次请求时验证权限。例如,生成带有时间戳或Token的临时链接。

$secretKey = 'your_secret_key';
$filePath = '/path/to/your/file.jpg';
$expireTime = time() + 3600; // 链接有效期1小时
$token = md5($secretKey . $filePath . $expireTime);

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

使用 .htaccess 文件

在Apache服务器中,可以通过 .htaccess 文件结合PHP实现防盗链。例如,禁止非指定域名的访问。

php 实现防盗链

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|mp4)$ - [NC,F,L]

输出资源时验证

在输出资源(如图片)时,通过PHP脚本验证请求来源。如果是非法请求,可以返回默认图片或错误信息。

$imagePath = 'path/to/image.jpg';
$allowed = ['example.com'];

if (!isset($_SERVER['HTTP_REFERER']) || !in_array(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST), $allowed)) {
    $imagePath = 'path/to/blocked.jpg';
}

header('Content-Type: image/jpeg');
readfile($imagePath);

结合Session或Cookie验证

为合法用户生成Session或Cookie,并在请求资源时验证其有效性。

session_start();
if (!isset($_SESSION['valid_user'])) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access denied');
}

// 输出资源
header('Content-Type: image/jpeg');
readfile('path/to/image.jpg');

注意事项

  • HTTP_REFERER 可以被伪造,因此单独依赖它不够安全,建议结合其他方法。
  • 动态链接会增加服务器负载,需权衡性能与安全性。
  • 对于CDN或缓存服务,可能需要额外配置以支持防盗链逻辑。

以上方法可根据实际需求组合使用,以提高防盗链的效果。

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

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…