当前位置:首页 > 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购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php实现聊天

php实现聊天

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

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php session实现购物车

php session实现购物车

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

php搜索功能的实现

php搜索功能的实现

实现PHP搜索功能的方法 数据库搜索 使用SQL的LIKE语句进行模糊匹配,适用于简单的搜索需求。 $searchTerm = $_GET['search']; $query = "SELECT *…