PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】


Posted in PHP onMay 29, 2020

本文实例讲述了PHP实现图片防盗链破解操作。分享给大家供大家参考,具体如下:

很多小伙伴的博客,网站都是用图床来实现的,那么现在很多稳定的图床接口都被做了防盗链处理,例如百度、阿里、京东、小米、搜狗等。

所以我们应该怎么避开防盗链直接使用图片呢?

1 防盗的原理是什么?

当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

referer是干啥用的呢?

它就是告诉服务器,这个请求的来源是谁,比如:从页面A跳转到页面B,那么页面B收到的referer就是页面A。

但是在图片身上和这个有点不同,图片是在html页面加载完毕后才加载的,所以图片收到的referer不是网页的上一个页面,而是当前页面。

说这么多,不要被说绕了,简单点就是:对于图片而言,收到的referer就是引用图片的这个网页的网址。

那么现在的很多网站是如何利用referer来进行防图片盗链的呢?

三种情况下允许引用图片:

  1. 本网站。
  2. 无referer信息的情况。(服务器认为是从浏览器直接访问的图片URL,所以这种情况下能正常访问)
  3. 白名单网址。

开始做防盗链处理

1、需要有一个服务器
2、代码使用php

<?php
 class ImgBridge{
  private $water='';
  private $imgUrl=''; 
  private $referer='';
  private $ua='MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1';
  private $imgCode='';
  private $imgHeader='';
  private $imgBody='';
  private $imgType='';

  public function \_\_construct($config=array()){
    foreach($config as $key=>$value){
      $this->$key=$value;
    }
  }
  
  public function getImg($imgUrl){
    $this->imgUrl=$imgUrl;
    /\*\* 处理url \*/
    if(substr($this->imgUrl,0,7)!=='http://' && substr($this->imgUrl,0,8)!=='https://'){
      $this->imgUrl='http://'.$this->imgUrl;
    }
    /\*\* 解析url中的host \*/
    $url\_array=parse\_url($this->imgUrl);
    /\*\* 设置referer \*/
    $this->referer=$this->referer==""?'http://'.$url\_array\['host'\]:$this->referer;
    /\*\*开始获取 \*/
    $this->urlOpen();
    $this->imgBody;
    /\*\*处理错误 \*/
    if($this->imgCode!=200){
      $this->error(1);
      exit();
    }
    
    /\*\*获取图片格式 \*/
    preg\_match("/Content-Type: image\\/(.+?)\\n/sim",$this->imgHeader,$result);
    /\*\*看看是不是图片 \*/
    if(!isset($result\[1\])){
      $this->error(2);
      exit();
    }else{
      $this->imgType=$result\[1\];
    }
    /\*\* 输出内容 \*/
    $this->out();    
  }
  private function out(){
    /\*\* gif 不处理,直接出图 \*/
    if($this->imgType=='gif'){
      header("Content-Type: image/gif");
      echo $this->imgBody;
      exit();
    }
    header("Content-Type: image/png");
    /\*\* 其他类型的,加水印 \*/
    $im=imagecreatefromstring($this->imgBody);
    $white = imagecolorallocate($im, 255, 255, 255);
    /\*加上水印\*/
    if($this->water){
      imagettftext($im, 12, 0, 20, 20, $white, "/fonts/hwxh.ttf", $this->water);      
    }
    imagepng($im);
    
  }
  private function error($err){
    header("Content-Type: image/jpeg");
    $im=imagecreatefromstring(file\_get\_contents('./default.jpg'));
    imagejpeg($im);
  }

  private function urlOpen()
  {
    $ch = curl\_init();
    curl\_setopt($ch, CURLOPT\_URL, $this->imgUrl);
    curl\_setopt($ch, CURLOPT\_USERAGENT, $this->ua);
    curl\_setopt ($ch,CURLOPT\_REFERER,$this->referer);
    curl\_setopt($ch, CURLOPT\_RETURNTRANSFER, 1);
    curl\_setopt($ch, CURLOPT\_HEADER, 1);
    /\*\*跳转也要 \*/
    curl\_setopt($ch, CURLOPT\_FOLLOWLOCATION, true);
    /\*\* 支持https \*/
    $opt\[CURLOPT\_SSL\_VERIFYHOST\] = 2;
    $opt\[CURLOPT\_SSL\_VERIFYPEER\] = FALSE;
    curl\_setopt\_array($ch, $opt);
    $response = curl\_exec($ch);
    $this->imgCode=curl\_getinfo($ch, CURLINFO\_HTTP\_CODE) ;
    if ($this->imgCode == '200') {
      $headerSize = curl\_getinfo($ch, CURLINFO\_HEADER\_SIZE);
      $this->imgHeader = substr($response, 0, $headerSize);
      $this->imgBody = substr($response, $headerSize);
      return ;
    }
    curl\_close($ch);
  }

 }
$img=new ImgBridge(array('water'=>''));
$img->getImg(strstr($\_SERVER\["QUERY\_STRING"\], "http"));

代码命名为dl.php

那么直接可以访问

http://域名/dl.php?url=防盗链图片地址

下面是我部署的反向代理

http://www.likeyunba.com/2.php?url=

请不要拿我的直接用,我的不会长期放着的,只保留短暂1-2个月用于给你们体验。

案例

我用135编辑器上传一张图片,获得图片地址

https://image.135editor.com/files/users/740/7407329/201912/zTeFAx8R_Cmea.jpg

加上反向代理,破解防盗链处理

http://www.likeyunba.com/2.php?url=https://image.135editor.com/files/users/740/7407329/201912/zTeFAx8R_Cmea.jpg

HTML格式

<img src="http://www.likeyunba.com/2.php?url=https://image.135editor.com/files/users/740/7407329/201912/zTeFAx8R_Cmea.jpg" width="500" />

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 上传文件类型判断函数(避免上传漏洞 )
Jun 08 PHP
PHP计划任务、定时执行任务的实现代码
Apr 23 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
zf框架db类的分页示例分享
Mar 14 PHP
php控制文件下载速度的方法
Mar 24 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
PHP中递归的实现实例详解
Nov 14 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 #PHP
PHP实现本地图片转base64格式并上传
May 29 #PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 #PHP
php生成短网址/短链接原理和用法实例分析
May 29 #PHP
PHP const定义常量及global定义全局常量实例解析
May 28 #PHP
PHP实现获取文件mime类型多种方法解析
May 28 #PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 #PHP
You might like
ZendFramework2连接数据库操作实例
2017/04/18 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
js删除所有的cookie的代码
2010/11/25 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
微信小程序分享小程序码的生成(带参数)以及参数的获取
2020/03/25 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[00:16]热血竞技场
2019/03/06 DOTA
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
原生python实现knn分类算法
2019/10/24 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
美国钻石商店:Zales
2016/11/20 全球购物
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
学校消防安全制度
2014/01/30 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL