当前位置:首页 > 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文件直接实现防盗链:

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中验证令牌:

$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)验证权限:

php实现盗链

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 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php 实现排名

php 实现排名

PHP 实现排名的方法 在 PHP 中实现排名功能通常涉及对数据进行排序、计算排名以及输出结果。以下是几种常见的实现方式: 基本数组排序排名 $scores = [85, 92, 78, 95, 8…

php 插件实现

php 插件实现

PHP 插件实现方法 PHP 插件可以通过多种方式实现,具体取决于插件的用途和功能需求。以下是一些常见的实现方法: 使用钩子(Hooks)和过滤器(Filters) 钩子和过滤器是一种常见的插件架…