php实现的网络相册图片防盗链完美破解方法


Posted in PHP onJuly 01, 2015

本文实例讲述了php实现的网络相册图片防盗链完美破解方法。分享给大家供大家参考。具体如下:

网络相册图片防盗链破解程序 - PHP版 这个防盗链破解版可以完美破解当下比较流行的: 百度相册,网易相册,360我喜欢等网站图片. 还可以实现简单的图片防盗链. 因为这个类是先进行获取远程图片, 然后再把图片发送到客户端,所以,算是进行了两次流量的传送.因此,会浪费空间流量,接下来,会开发缓存功能,这样可以实现节约流量!

<?php  
/**   
 * 网络相册图片防盗链破解程序 - PHP版   
 *   
 * 使用方法:   
 *    
 *   http://yourdomain/url.php?url=http://hiphotos.baidu.com/verdana/pic/item/baidupicture.jpg&referer=   
 *   其中url是指需要破解的图片URL,而referer是为了兼容一些不需要设置来路域名才能显示的相册,例如360我喜欢网,必须设置来路为空才能正常浏览. 所以,此时应该设置referer为1  
 *   
 * @author 雪狐博客   
 * @version 1.0   
 * @since  July 16, 2012  
 * @URL http://www.xuehuwang.com   
 */
class Frivoller   
{   
  /**   
   * HTTP 版本号 (1.0, 1.1) , 百度使用的是 version 1.1   
   *   
   * @var string   
   */
  protected $version;   
  /**   
   * 进行HTTP请求后响应的数据  
   *   
   * @var 字符串格式   
   */
  protected $body;   
  /**   
   * 需要获取的远程URL  
   *   
   * @var 字符串格式   
   */
  protected $link;   
  /**   
   * An array that containing any of the various components of the URL.   
   *   
   * @var array   
   */
  protected $components;   
  /**   
   * HTTP请求时HOST数据  
   *   
   * @var 字符串   
   */
  protected $host;   
  /**   
   * The path of required file.   
   * (e.g. '/verdana/abpic/item/mygirl.png')   
   *   
   * @var string   
   */
  protected $path;   
  /**   
   * The HTTP referer, extra it from original URL   
   *   
   * @var string   
   */
  protected $referer;   
  /**   
   * The HTTP method, 'GET' for default   
   *   
   * @var string   
   */
  protected $method  = 'GET';   
  /**   
   * The HTTP port, 80 for default   
   *   
   * @var int   
   */
  protected $port   = 80;   
  /**   
   * Timeout period on a stream   
   *   
   * @var int   
   */
  protected $timeout = 100;   
  /**   
   * The filename of image   
   *   
   * @var string   
   */
  protected $filename;   
  /**   
   * The ContentType of image file.   
   * image/jpeg, image/gif, image/png, image   
   *   
   * @var string   
   */
  protected $contentType;   
  /**   
   * Frivoller constructor   
   *   
   * @param string $link   
   */
  public function __construct($link,$referer='')   
  {   
    $this->referer = $referer;  
    // parse the http link   
    $this->parseLink($link);   
    // begin to fetch the image   
    $stream = pfsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);   
    if (!$stream){  
      header("Content-Type: $this->contentType;");   
      echo $this->CurlGet($link);   
    }else{   
      fwrite($stream, $this->buildHeaders());   
      $this->body = "";   
      $img_size = get_headers($link,true);  
      while (!feof($stream)) {   
        $this->body .= fgets($stream, $img_size['Content-Length']);   
        //fwrite($jpg,fread($stream, $img_size['Content-Length']));  
      }   
      $content = explode("\r\n\r\n", $this->body, 2);   
      $this->body = $content[1];  
      fclose($stream);    
      // send 'ContentType' header for saving this file correctly
      // 如果不发送CT,则在试图保存图片时,IE7 会发生错误 (800700de)   
      // Flock, Firefox 则没有这个问题,Opera 没有测试   
      header("Content-Type: $this->contentType;");   
      header("Cache-Control: max-age=315360000");  
      echo $this->body;     
       //保存图片  
       //file_put_contents('hello.jpg', $this->body);   
    }  
  }   
  /**   
   * Compose HTTP request header   
   *   
   * @return string   
   */
  private function buildHeaders()   
  {   
    $request = "$this->method $this->path HTTP/1.1\r\n";   
    $request .= "Host: $this->host\r\n";   
    $request .= "Accept-Encoding: gzip, deflate\r\n";  
    $request .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1\r\n";
    $request .= "Content-Type: image/jpeg\r\n";   
    $request .= "Accept: */*\r\n";   
    $request .= "Keep-Alive: 300\r\n";   
    $request .= "Referer: $this->referer\r\n";   
    $request .= "Cache-Control: max-age=315360000\r\n";   
    $request .= "Connection: close\r\n\r\n";   
    return $request;   
  }   
  /**   
   * Strip initial header and filesize info   
   */   
  private function extractBody(&$body)   
  {     
    // The status of link   
    if(strpos($body, '200 OK') > 0) {   
      // strip header   
      $endpos = strpos($body, "\r\n\r\n");   
      $body = substr($body, $endpos + 4);   
      // strip filesize at nextline   
      $body = substr($body, strpos($body, "\r\n") + 2);   
    }       
  }   
  /**   
   * Extra the http url   
   *   
   * @param $link   
   */
  private function parseLink($link)   
  {   
    $this->link     = $link;   
    $this->components  = parse_url($this->link);   
    $this->host     = $this->components['host'];   
    $this->path     = $this->components['path'];   
    if(empty($this->referer)){  
      $this->referer   = $this->components['scheme'] . '://' . $this->components['host'];   
    }elseif($this->referer == '1'){  
      $this->referer   = '';  
    }  
    $this->filename   = basename($this->path);   
    // extract the content type   
    $ext = substr(strrchr($this->path, '.'), 1);   
    if ($ext == 'jpg' or $ext == 'jpeg') {   
      $this->contentType = 'image/pjpeg';   
    }   
    elseif ($ext == 'gif') {   
      $this->contentType = 'image/gif';   
    }   
    elseif ($ext == 'png') {   
      $this->contentType = 'image/x-png';   
    }   
    elseif ($ext == 'bmp') {   
      $this->contentType = 'image/bmp';   
    }   
    else {   
      $this->contentType = 'application/octet-stream';   
    }   
  }   
  //抓取网页内容   
  function CurlGet($url){   
    $url = str_replace('&','&',$url);   
    $curl = curl_init();   
    curl_setopt($curl, CURLOPT_URL, $url);   
    curl_setopt($curl, CURLOPT_HEADER, false);   
    curl_setopt($curl, CURLOPT_REFERER,$url);   
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; SeaPort/1.2; Windows NT 5.1; SV1; InfoPath.2)");   
    curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');   
    curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');   
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);   
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);   
    $values = curl_exec($curl);   
    curl_close($curl);   
    return $values;   
  }   
}   
/**  
 * 取得根域名  
 *  
 * @author   lonely  
 * @create    2011-3-11  
 * @version  0.11  
 * @lastupdate lonely  
 * @package Sl  
*/
class RootDomain{  
   private static $self;  
  private $domain=null;  
  private $host=null;  
  private $state_domain;  
  private $top_domain;  
  /**  
   * 取得域名分析实例  
   * Enter description here ...  
   */
  public static function instace(){  
    if(!self::$self)  
      self::$self=new self();  
    return self::$self;  
  }  
  public function __construct(){  
    $this->state_domain=array(  
      'al','dz','af','ar','ae','aw','om','az','eg','et','ie','ee','ad','ao','ai','ag','at','au','mo','bb','pg','bs','pk','py','ps','bh','pa','br','by','bm','bg','mp','bj','be','is','pr','ba','pl','bo','bz','bw','bt','bf','bi','bv','kp','gq','dk','de','tl','tp','tg','dm','do','ru','ec','er','fr','fo','pf','gf','tf','va','ph','fj','fi','cv','fk','gm','cg','cd','co','cr','gg','gd','gl','ge','cu','gp','gu','gy','kz','ht','kr','nl','an','hm','hn','ki','dj','kg','gn','gw','ca','gh','ga','kh','cz','zw','cm','qa','ky','km','ci','kw','cc','hr','ke','ck','lv','ls','la','lb','lt','lr','ly','li','re','lu','rw','ro','mg','im','mv','mt','mw','my','ml','mk','mh','mq','yt','mu','mr','us','um','as','vi','mn','ms','bd','pe','fm','mm','md','ma','mc','mz','mx','nr','np','ni','ne','ng','nu','no','nf','na','za','aq','gs','eu','pw','pn','pt','jp','se','ch','sv','ws','yu','sl','sn','cy','sc','sa','cx','st','sh','kn','lc','sm','pm','vc','lk','sk','si','sj','sz','sd','sr','sb','so','tj','tw','th','tz','to','tc','tt','tn','tv','tr','tm','tk','wf','vu','gt','ve','bn','ug','ua','uy','uz','es','eh','gr','hk','sg','nc','nz','hu','sy','jm','am','ac','ye','iq','ir','il','it','in','id','uk','vg','io','jo','vn','zm','je','td','gi','cl','cf','cn','yr'
    );  
    $this->top_domain=array('com','arpa','edu','gov','int','mil','net','org','biz','info','pro','name','museum','coop','aero','xxx','idv','me','mobi');  
    $this->url=$_SERVER['HTTP_HOST'];  
  }  
  /**  
   * 设置URL  
   * Enter description here ...  
   * @param string $url  
   */
  public function setUrl($url=null){  
    $url=$url?$url:$this->url;  
    if(empty($url))return $this;  
    if(!preg_match("/^http:/is", $url))  
      $url="http://".$url;  
    $url=parse_url(strtolower($url));  
    $urlarr=explode(".", $url['host']);  
    $count=count($urlarr);  
    if ($count<=2){  
      $this->domain=$url['host'];  
    }else if ($count>2){  
      $last=array_pop($urlarr);  
      $last_1=array_pop($urlarr);  
      if(in_array($last, $this->top_domain)){  
        $this->domain=$last_1.'.'.$last;  
        $this->host=implode('.', $urlarr);  
      }else if (in_array($last, $this->state_domain)){  
        $last_2=array_pop($urlarr);  
        if(in_array($last_1, $this->top_domain)){  
          $this->domain=$last_2.'.'.$last_1.'.'.$last;  
          $this->host=implode('.', $urlarr);  
        }else{  
          $this->host=implode('.', $urlarr).$last_2;  
          $this->domain=$last_1.'.'.$last;  
        }  
      }  
    }  
    return $this;  
  }  
  /**  
   * 取得域名  
   * Enter description here ...  
   */
  public function getDomain(){  
    return $this->domain;  
  }  
  /**  
   * 取得主机  
   * Enter description here ...  
   */
  public function getHost(){  
    return $this->host;  
  }  
}  
$referer = array('xuehuwang.com','zangbala.cn','qianzhebaikou.net','sinaapp.com','163.com','sina.com.cn','weibo.com','abc.com');  
// Get the url, maybe you should check the given url   
if (isset($_GET['url']) and $_GET['url'] != '') {   
  //获取来路域名  
  $site = (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
  //匹配是否是一个图片链接  
  if(preg_match('/(http|https|ftp|rtsp|mms):(\/\/|\\\\){1}((\w)+[.]){1,}([a-zA-Z]|[0-9]{1,3})(\S*\/)((\S)+[.]{1}(gif|jpg|png|bmp))/i',$_GET['url'])){  
    if(!empty($site)){  
      $tempu = parse_url($site);  
      $host = $tempu['host'];  
      $root = new RootDomain();  
      $root->setUrl($site);  
      if(in_array($root->getDomain(),$referer)){  
        $img_referer = (isset($_GET['referer']) && !empty($_GET['referer']))? trim($_GET['referer']) : '';  
        new Frivoller($_GET['url'],$img_referer);   
      }  
    }else{  
      $img_referer = (isset($_GET['referer']) && !empty($_GET['referer']))? trim($_GET['referer']) : '';  
      new Frivoller($_GET['url'],$img_referer);   
    }  
  }  
}   
?>

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

PHP 相关文章推荐
php 函数使用方法与函数定义方法
May 09 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
PHP基础之运算符的使用方法
Apr 28 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
PHP Echo字符串的连接格式
Mar 07 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
php mysql like 实现多关键词搜索的方法
Oct 29 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
php实现的XML操作(读取)封装类完整实例
Feb 23 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 #PHP
php检测图片主要颜色的方法
Jul 01 #PHP
PHP函数实现从一个文本字符串中提取关键字的方法
Jul 01 #PHP
浅谈php提交form表单
Jul 01 #PHP
用PHP代码给图片加水印
Jul 01 #PHP
用PHP代码在网页上生成图片
Jul 01 #PHP
PHP文件操作方法汇总
Jul 01 #PHP
You might like
用PHP读取超大文件的实例代码
2012/04/01 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
封装html的select标签的js操作实例
2013/07/02 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
Python 第一步 hello world
2009/09/25 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python使用fork实现守护进程的方法
2017/11/16 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
django admin组件使用方法详解
2019/07/19 Python
python django生成迁移文件的实例
2019/08/31 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
Django数据统计功能count()的使用
2020/11/30 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
党风廉设责任书
2014/04/16 职场文书
卖房授权委托书样本
2014/10/05 职场文书
会议欢迎词
2015/01/23 职场文书
综合测评个人总结
2015/03/03 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript