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数据库开发知多少
Oct 09 PHP
Php Cookie的一个使用注意点
Nov 08 PHP
完美解决PHP中文乱码
Nov 26 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
php的ZipArchive类用法实例
Oct 20 PHP
php模拟post提交数据的方法
Feb 12 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 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
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
python list转dict示例分享
2014/01/28 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
css3的transition属性详解
2014/12/15 HTML / CSS
EJB的角色和三个对象
2015/12/31 面试题
日期和时间问题
2015/01/04 面试题
大学学年自我鉴定
2013/10/28 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
初中语文教学反思范文
2016/03/03 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL