PHP写的资源下载防盗链类分享


Posted in PHP onMay 12, 2014

这几天在写一个PHP防盗链外部资源下载处理函数,昨天晚上刚完成编写,中间遇到了些问题,这里就不详述了;
以下是自写的简单的PHP防盗链处理类(重新整理编写成类文件,以便后期改进);

<?php
/**
 *
 * 防盗链外部资源下载处理类
 * 
 * @link   http://3water.com
 * 
 */
class BurglarDow{
 /**
     * 初始许可下载状态
     * @var    allow
     * @access private
     */
 private $allow      =  false;
 /**
     * 初始下载地址
     * @var    dowUrl
     * @access private
     */
 private $dowUrl     =  null;
 /**
     * 初始来路域名
     * @var    RemoteUrl
     * @access private
     */
 private $RemoteUrl  =  null;
 /**
     * 初始许可资源取用域名列表
     * @var    allowUrl
     * @access private
     */
 private $allowUrl   =  array();
 /**
     * 初始转跳地址
     * @var    Location
     * @access private
     */
 private $Location   =  null;
 public function __construct($dowUrl,$Location,array $allowUrl){
  // 初始下载地址
  $this->dowUrl   = $dowUrl;
  // 初始许可资源取用域名列表
  $this->allowUrl = $allowUrl;
  // 初始转跳地址
  $this->Location = $Location;
  $this->RemoteUrl = @parse_url($_SERVER['HTTP_REFERER']);                                                      // 获取来路域名
  if(!is_array($this->RemoteUrl))
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: ".$this->Location);
  if(isset($this->RemoteUrl['host'])){
   if(in_array($this->RemoteUrl['host'],$this->allowUrl)){                                                   // 判断是否来至许可域名
    $this->allow  = true;                                                                                 // 下载许可状态为:真
   }
  }
  unset($this->allowUrl,$this->RemoteUrl);                                                                      // 释放内存变量
 }
 /**
  * 防盗链资源下载
  * @access public
  * @return mixed
  */
 public function dow(){
  $FileInfo = get_headers($this->dowUrl,1);                                                                     // 获取远程文件头部信息
  if(true === $this->allow){                                                                                    // 判断是否许可下载资源
   //判断配置文件是否存在
   if(is_file('Config.ini')){
    $FileCon = parse_ini_file('Config.ini');
   }else{
    $FileName   =  basename($FileInfo['Content-Location']);
    $FileConStr = "FileName  = {$FileName}\r\nFileUrl   = {$FileInfo['Content-Location']}\r\nFileSize   = {$FileInfo['Content-Length']}";
    $handle = fopen ('Config.ini', "wb");                                                                 // Config.ini文件不存在则创建文件
    if (fwrite ($handle, $FileConStr) == FALSE) {                                                         // 数据写入文件 
     echo "File creation failed ..."; 
    }
    fclose ($handle);                                                                                     // 关闭一个已打开的文件指针
    $FileCon = parse_ini_file('Config.ini');
   }
   if(!empty($$this->dowUrl)){
    $fp = @fopen($$this->dowUrl, "rb");                                                                   // 二进制模式读取文件
    if (!$fp)
      exit("Download a mistake.\n\n");
    // 输出远程资源
    header("Content-type:text/html;charset=utf-8");
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$FileCon['FileName']);
    header("Accept-Ranges: bytes");
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Pragma: public');
    header('Content-Length: '.$FileCon['FileSize']);
    while (!feof($fp)){
     set_time_limit(0);                                                                                 // 设置文件最长执行时间
     echo fread($fp, 1024);                                                                             // 输出文件
     flush();                                                                                           // 输出缓冲
     ob_flush();                                                                                        // 输出缓冲区中的内容
    }
    fclose($fp);
   }else{
    header("HTTP/1.1 404 Not Found");
   }
  }else{
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: ".$this->Location);
  }
 }
}
// 远程资源地址
$dowUrl = 'http://dldir1.qq.com/qqfile/qq/QQ5.1/10055/QQ5.1.exe';
// 转跳地址
$Location = 'http://3water.com';
// 许可来路域名列表
$allowUrl = array(
 '3water.com',
);
$BurglarDow = new BurglarDow($dowUrl,$Location,$allowUrl);
$BurglarDow -> dow();
PHP 相关文章推荐
Smarty结合Ajax实现无刷新留言本实例
Jan 02 PHP
回答PHPCHINA上的几个问题:URL映射
Feb 14 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
Jun 21 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
简单介绍win7下搭建apache+php+mysql开发环境
Aug 06 PHP
php技巧小结【推荐】
Jan 19 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
phpstudy隐藏index.php的方法
Sep 21 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 #PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 #PHP
linux使用crontab实现PHP执行计划定时任务
May 10 #PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 #PHP
php判断电脑访问、手机访问的例子
May 10 #PHP
php计算程序运行时间的简单例子分享
May 10 #PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 #PHP
You might like
个人站长制做网页常用的php代码
2007/03/03 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php时区转换转换函数
2014/01/07 PHP
ThinkPHP之import方法实例详解
2014/06/20 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
可输入的下拉框
2006/06/19 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
用vue写一个日历
2020/11/02 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
python中返回矩阵的行列方法
2018/04/04 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
什么是测试驱动开发(TDD)
2012/02/15 面试题
中学生学习生活的自我评价
2013/10/26 职场文书
求职信模版
2013/11/30 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
给医院的感谢信
2015/01/21 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书