0

0

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

PHP中文网

PHP中文网

发布时间:2016-05-23 16:40:43

|

1544人浏览过

|

来源于php中文网

原创

这篇文章主要介绍了php实现的网络相册图片防盗链完美破解方法,可实现针对设置了防盗链网络相册图片的抓取功能,非常具有实用价值,需要的朋友可以参考下

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

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

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用AI匹配职位并完成投递的全自动操作,真正实现'一键职达'的便捷体验。

下载

<?php  
/**   
 * &#32593;&#32476;&#30456;&#20876;&#22270;&#29255;&#38450;&#30423;&#38142;&#30772;&#35299;&#31243;&#24207; - PHP&#29256;   
 *   
 * &#20351;&#29992;&#26041;&#27861;&#65306;   
 *    
 *   http://www.php.cn/://hiphotos.baidu.com/verdana/pic/item/baidupicture.jpg&referer=   
 *   &#20854;&#20013;url&#26159;&#25351;&#38656;&#35201;&#30772;&#35299;&#30340;&#22270;&#29255;URL,&#32780;referer&#26159;&#20026;&#20102;&#20860;&#23481;&#19968;&#20123;&#19981;&#38656;&#35201;&#35774;&#32622;&#26469;&#36335;&#22495;&#21517;&#25165;&#33021;&#26174;&#31034;&#30340;&#30456;&#20876;,&#20363;&#22914;360&#25105;&#21916;&#27426;&#32593;,&#24517;&#39035;&#35774;&#32622;&#26469;&#36335;&#20026;&#31354;&#25165;&#33021;&#27491;&#24120;&#27983;&#35272;. &#25152;&#20197;,&#27492;&#26102;&#24212;&#35813;&#35774;&#32622;referer&#20026;1  
 *   
 * @author &#38634;&#29392;&#21338;&#23458;   
 * @version 1.0   
 * @since  July 16, 2012  
 * @URL http://www.php.cn/   
 */
class Frivoller   
{   
  /**   
   * HTTP &#29256;&#26412;&#21495; (1.0, 1.1) , &#30334;&#24230;&#20351;&#29992;&#30340;&#26159; version 1.1   
   *   
   * @var string   
   */
  protected $version;   
  /**   
   * &#36827;&#34892;HTTP&#35831;&#27714;&#21518;&#21709;&#24212;&#30340;&#25968;&#25454;  
   *   
   * @var &#23383;&#31526;&#20018;&#26684;&#24335;   
   */
  protected $body;   
  /**   
   * &#38656;&#35201;&#33719;&#21462;&#30340;&#36828;&#31243;URL  
   *   
   * @var &#23383;&#31526;&#20018;&#26684;&#24335;   
   */
  protected $link;   
  /**   
   * An array that containing any of the various components of the URL.   
   *   
   * @var array   
   */
  protected $components;   
  /**   
   * HTTP&#35831;&#27714;&#26102;HOST&#25968;&#25454;  
   *   
   * @var &#23383;&#31526;&#20018;   
   */
  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("

", $this->body, 2);   
      $this->body = $content[1];  
      fclose($stream);    
      // send 'ContentType' header for saving this file correctly
      // &#22914;&#26524;&#19981;&#21457;&#36865;CT&#65292;&#21017;&#22312;&#35797;&#22270;&#20445;&#23384;&#22270;&#29255;&#26102;&#65292;IE7 &#20250;&#21457;&#29983;&#38169;&#35823; (800700de)   
      // Flock, Firefox &#21017;&#27809;&#26377;&#36825;&#20010;&#38382;&#39064;&#65292;Opera &#27809;&#26377;&#27979;&#35797;   
      header("Content-Type: $this->contentType;");   
      header("Cache-Control: max-age=315360000");  
      echo $this->body;     
       //&#20445;&#23384;&#22270;&#29255;  
       //file_put_contents('hello.jpg', $this->body);   
    }  
  }   
  /**   
   * Compose HTTP request header   
   *   
   * @return string   
   */
  private function buildHeaders()   
  {   
    $request = "$this->method $this->path HTTP/1.1
";   
    $request .= "Host: $this->host
";   
    $request .= "Accept-Encoding: gzip, deflate
";  
    $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
";
    $request .= "Content-Type: image/jpeg
";   
    $request .= "Accept: */*
";   
    $request .= "Keep-Alive: 300
";   
    $request .= "Referer: $this->referer
";   
    $request .= "Cache-Control: max-age=315360000
";   
    $request .= "Connection: close

";   
    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, "

");   
      $body = substr($body, $endpos + 4);   
      // strip filesize at nextline   
      $body = substr($body, strpos($body, "
") + 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';   
    }   
  }   
  //&#25235;&#21462;&#32593;&#39029;&#20869;&#23481;   
  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;   
  }   
}   
/**  
 * &#21462;&#24471;&#26681;&#22495;&#21517;  
 *  
 * @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;  
  /**  
   * &#21462;&#24471;&#22495;&#21517;&#20998;&#26512;&#23454;&#20363;  
   * 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'];  
  }  
  /**  
   * &#35774;&#32622;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;  
  }  
  /**  
   * &#21462;&#24471;&#22495;&#21517;  
   * Enter description here ...  
   */
  public function getDomain(){  
    return $this->domain;  
  }  
  /**  
   * &#21462;&#24471;&#20027;&#26426;  
   * 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'] != '') {   
  //&#33719;&#21462;&#26469;&#36335;&#22495;&#21517;  
  $site = (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
  //&#21305;&#37197;&#26159;&#21542;&#26159;&#19968;&#20010;&#22270;&#29255;&#38142;&#25509;  
  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怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

1

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

10

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

1

2026.02.12

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

7

2026.02.12

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

195

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

640

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

94

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

7

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号