当前位置:首页 > PHP

php 实现防盗链

2026-01-29 05:50:54PHP

防盗链的基本原理

防盗链(Hotlink Protection)是一种防止其他网站直接链接到你的资源(如图片、视频、文件等)的技术。通过检查HTTP请求头中的Referer字段,可以判断请求是否来自合法域名。

使用.htaccess文件实现

Apache服务器可以通过.htaccess文件实现防盗链。以下是一个典型的配置示例:

php 实现防盗链

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule \.(jpg|jpeg|png|gif|mp4)$ - [NC,F,L]
  • NC表示不区分大小写。
  • F返回403禁止访问状态码。
  • L表示这是最后一条规则。

PHP代码实现防盗链

在PHP中,可以通过检查$_SERVER['HTTP_REFERER']来实现防盗链:

$allowed_domains = ['yourdomain.com', 'www.yourdomain.com'];
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$is_allowed = false;

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

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

使用Nginx配置实现

对于Nginx服务器,可以在配置文件中添加以下内容:

php 实现防盗链

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

动态生成资源

另一种更安全的方法是动态生成资源链接,而不是直接提供静态文件URL:

// 生成带令牌的图片URL
function generate_secure_url($file_path) {
    $secret = 'your_secret_key';
    $token = md5($secret . $file_path . time());
    return "download.php?file=" . urlencode($file_path) . "&token=$token";
}

// 验证并输出文件
$file = $_GET['file'] ?? '';
$token = $_GET['token'] ?? '';

if (verify_token($file, $token)) {
    header('Content-Type: ' . mime_content_type($file));
    readfile($file);
} else {
    header('HTTP/1.1 403 Forbidden');
    exit('Invalid access token');
}

使用CDN的防盗链功能

许多CDN服务(如Cloudflare、阿里云CDN等)都提供内置的防盗链功能。通常可以通过控制面板设置允许的Referer白名单,或者配置时间限制的访问令牌。

注意事项

  • Referer头可以被伪造,不能完全依赖这种方式进行安全保护。
  • 某些浏览器或隐私设置可能不发送Referer头,需要特别处理这种情况。
  • 对于重要资源,建议结合多种保护措施,如动态URL生成、访问控制等。

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

相关文章

php实现递归

php实现递归

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

php实现增删改查

php实现增删改查

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

php实现定时任务

php实现定时任务

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

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form actio…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php 购物车实现

php 购物车实现

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