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中动态显示签名和ip原理
Mar 28 PHP
PHP 输出缓存详解
Jun 20 PHP
php根据身份证号码计算年龄的实例代码
Jan 18 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
Yii实现简单分页的方法
Apr 29 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
PHP正则判断一个变量是否为正整数的方法
Feb 27 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
PHP解决高并发的优化方案实例
Dec 10 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
linux php mysql数据库备份实现代码
2009/03/10 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
javascript下拉列表菜单的实现方法
2015/11/18 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
Highcharts入门之简介
2016/08/02 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python实现爬取图书封面
2018/07/05 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
农场厂长岗位职责
2013/12/28 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
2014年公司工作总结
2014/11/22 职场文书
先进典型发言材料
2014/12/30 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书