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不用内置函数对数组排序的两个算法代码
Feb 08 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
PHP多个文件上传到服务器实例
Oct 29 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
PHP7基于curl实现的上传图片功能
May 11 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 PHP
Laravel基础-关于引入公共文件的两种方式
Oct 18 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
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python 实现UTC时间加减的方法
2018/12/31 Python
python实现邮件循环自动发件功能
2020/09/11 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
同事吵架检讨书
2014/02/05 职场文书
社会公德演讲稿
2014/05/20 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
房屋所有权证明
2014/10/20 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书