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 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 PHP
深入PHP中的HashTable结构详解
Jun 13 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
Sep 16 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHP判断手机是IOS还是Android
Dec 09 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
php中的比较运算符详解
2013/10/28 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
怎样使用Python脚本日志功能
2016/08/14 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Django实现跨域请求过程详解
2019/07/25 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
大学生的四年学习自我评价
2013/12/13 职场文书
销售找工作求职信
2013/12/20 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
同意转租证明
2015/06/24 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
python blinker 信号库
2022/05/04 Python