PHP图片防盗链技术

  图片防盗链的核心原理:验证图片请求的域名来源,只允许本站加载图片,拒绝外部未授权网站引用图片地址,以达到防盗链的目的。

  浏览器请求图片时,会执行HTTP_REFERER请求头,记录从哪个页面发起请求,用程序判断读取该来源的地址,是否是合法域名,是则输出图片,否则返回禁止图片或403。

  方案1:基础防盗链

  img.php

<?php
// 允许访问的域名
$allow_hosts = [
    'localhost',       // 本地测试
    'yourname.com',    // 你的主域名
    'www.yourname.com' // 你的www域名
];

// 图片真实目录
$image_dir = __DIR__ . '/uploads/';
// 防盗链默认图片
$forbidden_img = __DIR__ . '/forbidden.png';

// 获取请求来源
$referer = $_SERVER['HTTP_REFERER'] ?? '';

// 验证来源是否合法
$is_allow = false;
if (!empty($referer)) {
    $referer_host = parse_url($referer, PHP_URL_HOST);
    $is_allow = in_array($referer_host, $allow_hosts);
}

// 获取访问图片文件名
$filename = $_GET['file'] ?? '';
$filename = basename($filename); // 只保留文件名
$real_file = $image_dir . $filename;

// 输出哪张图片
if ($is_allow && file_exists($real_file)) {
    // 输出真实图片
    $output_file = $real_file;
} else {
    // 输出防盗链提示图
    $output_file = $forbidden_img;
}

// 输出图片
$mime = mime_content_type($output_file);
header("Content-Type: $mime");
header("Content-Length: " . filesize($output_file));
readfile($output_file);
exit;
?>

  使用方法

<!-- 正常写法 -->
<img src="/uploads/1.jpg">

<!-- 防盗链写法 -->
<img src="/img.php?file=1.jpg">

  方案2:推荐生产环境

  img.php

<?php
// 允许访问的域名
$allow_hosts = [
    'localhost',       // 本地测试
    'yourname.com',    // 你的主域名
    'www.yourname.com' // 你的www域名
];

// 图片真实目录
$image_dir = __DIR__ . '/uploads/';
// 防盗链默认图片
$forbidden_img = __DIR__ . '/forbidden.png';

// 强制校验REFERER
if (empty($_SERVER['HTTP_REFERER'])) {
    show_forbidden_img($forbidden_img);
}

$referer = $_SERVER['HTTP_REFERER'];
$referer_host = parse_url($referer, PHP_URL_HOST);

// 域名白名单验证
if (!in_array($referer_host, $allow_hosts)) {
    show_forbidden_img($forbidden_img);
}

// 安全获取文件名
$filename = basename($_GET['file'] ?? '');
$real_file = $image_dir . $filename;

// 判断输出图片
if (file_exists($real_file)) {
    output_image($real_file);
} else {
    show_forbidden_img($forbidden_img);
}

// 输出禁止图片
function show_forbidden_img($img) {
    output_image($img);
    exit;
}

// 输出图片函数
function output_image($path) {
    $mime = mime_content_type($path);
    header("Content-Type: $mime");
    header("Content-Length: " . filesize($path));
    readfile($path);
}
?>

  方案3:Nginx防盗链,更方便

location ~* \.(jpg|jpeg|png|gif|bmp)$ {
    valid_referers none blocked server_names yourname.com www.yourname.com;
    if ($invalid_referer) {
        # 返回盗链提示图
        rewrite ^ /forbidden.png last;
        # 返回403
        # return 403;
    }
    expires 30d; # 缓存30天
}

本站原创内容,转载请注明来源:https://www.liutonghui.com/17

没有上一篇
PHP使用内置函数处理JSON数据
下一篇 2013-10-09

评论列表(0条)

  • 暂无评论

发表评论

captcha

相关推荐

  • PHP使用内置函数处理JSON数据

      JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于在前端和后端之间传递数据。在PHP中,你可以使用内置的函数来处理JSON数据,实现数据的编码和解码。   以下是PHP中JSON的一些常见应用:   1. 编码(PHP对象转为JSON字符串)   使用 json_encode() 函数可以将PHP对象转换为JSON格式的字符串: $data = array( 'name' =......

    2013-10-09
    16770
  • PHP隐藏文件真实下载地址防盗链功能

      这个方案核心是隐藏文件真实地址,文件存放在网站根目录外(无法直接HTTP访问),或用权限锁定,只允许PHP。读取用动态临时下载链接替代,定时随机变更链接,随机密钥不可预测,过期自动失效。   校验来源域名、IP地址、链接有效期、签名,彻底防止盗链、批量下载、服务器过载。单IP限速、单文件并发下载限制、错误次数锁定,防止服务器过载。PHP代理输出文件,支持大文件断点续传   1.配置文件(config.php)统一管理密钥、有效期、限......

    2013-12-06
    21440
  • PHP图片验证码功能简单开发

      验证码是网站开发中常用的功能,可以保证用户提交数据和服务器的安全,验证码的形态也是千奇百怪,从传统的数字+字母,到拼图,再到找元素等等越来越复杂。   今天说一下用PHP原生开发方式如何写一个最常见的数字+字母图片验证码功能,过程非常简单。   首先创建验证码生成文件verify.php &lt;?php // 开启session session_start(); // 创建图片资源,宽高 $img = imagecreatetru......

    2014-08-02
    21060
  • PHP利用正则表达式提取内容中图片的函数

      用PHP开发产品中经常需要从某部分内容中提取出图片,比如在一个表单中,我们需要从内容中提取出图片的路径当作缩略图,这时就可以用正则表达式的规则匹配的方法来提取出图片路径,利用下面这个函数来完成。 &lt;?php function getImgs($content,$order='ALL'){ $pattern="//"; preg_match_all($pattern,$content,$match); ......

    2015-01-07
    23810
  • 净月静悦

      远离城市的热闹喧嚣,远离那些是是非非。我喜欢安静,安静可以让我更专注的思考,只想安安静静的放空自己,感受只有大自然最原本的形态。望向远处成片的山林,空气格外清新。潭水安安静静的,水面平平缓缓,听着风吹树叶和湖水荡漾的声音,让人清静又自在。   在这一刻,什么妖魔鬼怪,什么牛鬼蛇神,什么名利算计,恩怨是非,什么真真假假,谎言吹嘘,小丑窜跳,通通灰飞烟灭。 ......

    2016-06-29
    22420
  • ThinkPHP6开发wangEditor图片上传接口的方法

      wangEditor是一款近几年非常流行的富文本编辑器,它界面简洁,功能非常强大,本文介绍WangEditor图片上传接口的开发,以Thinkphp6为例。   首先看一下wangEditor官方的接口返回要求:   然后开发Thinkphp6的上传功能: public function testup(){ $file = request()-&gt;file('file'); $savename = \think......

    2021-03-02
    19010
  • PHP防止短时间内刷阅读量的方法

      防止短时间内刷阅读量是一个常见的需求,通常需要使用一些技术手段来检测和限制恶意访问。以下是一些可能的方法:   使用 Cookie 或 Session:   通过在用户访问时设置一个 Cookie 或 Session 记录,记录用户最后一次访问的时间戳。在下一次访问时,可以检查当前时间与上次访问的时间戳之间的差异,如果差异太小,则可能是刷阅读量的行为。 session_start(); $currentTime = time();......

    2021-05-06
    17930
  • PHP实现相关文章推荐功能

      实现相关文章推荐功能通常需要使用更高级的推荐系统算法,对于查询到的相关文章,需要计算它们与当前文章的相似度。相似度可以根据文章的内容、标题、标签等属性进行计算。可以使用文本相似度算法(如余弦相似度、Jaccard相似度等)或基于内容的推荐算法来计算相似度。   假设有一个包含文章信息的数据库表 articles: CREATE TABLE articles ( id INT PRIMARY KEY, title VA......

    2021-05-24
    17410