当前位置:首页 > 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)验证权限:

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
分享给朋友:

相关文章

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现socket

php实现socket

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

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必…

php 实现接口

php 实现接口

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