当前位置:首页 > PHP

php实现盗链

2026-01-30 01:34:32PHP

实现防盗链的方法

在PHP中实现防盗链(Hotlink Protection)可以通过检查HTTP请求的Referer头部信息,判断请求是否来自允许的域名。以下是几种常见的实现方式:

检查Referer头部

通过检查$_SERVER['HTTP_REFERER'],判断请求来源是否合法:

$allowedDomains = ['example.com', 'trusted-site.com'];
$referer = parse_url($_SERVER['HTTP_REFERER'] ?? '', PHP_URL_HOST);

if (!in_array($referer, $allowedDomains)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Access denied - Hotlinking not allowed');
}
  • 如果Referer不在白名单中,返回403禁止访问。
  • 注意:Referer可能被伪造或缺失,需结合其他方法增强安全性。

使用.htaccess文件

在Apache服务器中,可以通过.htaccess文件直接实现防盗链:

php实现盗链

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://(www\.)?example\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^https://(www\.)?trusted-site\.com/ [NC]
RewriteRule \.(jpg|png|gif|mp4)$ - [F]
  • 规则会阻止非白名单域名访问图片或视频文件。
  • [F]表示返回403状态码。

动态生成资源链接

通过PHP动态生成带有令牌(Token)的资源链接,验证合法性:

// 生成加密令牌
$secret = 'your-secret-key';
$file = 'protected-image.jpg';
$expires = time() + 3600; // 1小时有效期
$token = md5($secret . $file . $expires);

// 输出带令牌的链接
echo "<img src='get_file.php?file=$file&token=$token&expires=$expires'>";

get_file.php中验证令牌:

php实现盗链

$secret = 'your-secret-key';
$file = $_GET['file'];
$token = $_GET['token'];
$expires = $_GET['expires'];

if (time() > $expires || $token !== md5($secret . $file . $expires)) {
    header('HTTP/1.1 403 Forbidden');
    exit('Invalid token');
}

// 输出文件内容
header('Content-Type: image/jpeg');
readfile($file);

使用Nginx配置

在Nginx中可通过valid_referers指令实现:

location ~* \.(jpg|png|gif)$ {
    valid_referers none blocked example.com *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}
  • none表示允许直接访问(无Referer)。
  • blocked允许Referer被防火墙修改的请求。

结合会话验证

对于用户私有资源,可通过会话(Session)验证权限:

session_start();
if (!isset($_SESSION['user_id'])) {
    header('HTTP/1.1 403 Forbidden');
    exit('Login required');
}

// 输出文件
header('Content-Type: image/jpeg');
readfile('private-image.jpg');

注意事项

  • Referer检查可能影响SEO或合法引用,需谨慎设置白名单。
  • 动态令牌会增加服务器开销,但安全性更高。
  • 对于静态资源,服务器配置(如.htaccess或Nginx)性能更优。

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

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php实现队列

php实现队列

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

php实现排序

php实现排序

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

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…