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 相关文章推荐
PHP+ajax 无刷新删除数据
Feb 20 PHP
php自定义函数之递归删除文件及目录
Aug 08 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
PHP文件缓存类实现代码
Oct 26 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
PHP实现的网站目录扫描索引工具
Sep 08 PHP
php自定义函数转换html标签示例
Sep 29 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 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
Snoopy类使用小例子
2008/04/15 PHP
php学习之function的用法
2012/07/14 PHP
PHP eval函数使用介绍
2013/12/08 PHP
简单谈谈favicon
2015/06/10 PHP
JS 类型转换常见方法小结
2010/05/31 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
linux中如何使用python3获取ip地址
2019/07/15 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
详解python with 上下文管理器
2020/09/02 Python
通过代码实例了解Python sys模块
2020/09/14 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
如何用Python绘制3D柱形图
2020/09/16 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
计算机专业毕业生自荐信范文
2014/03/06 职场文书
经典商业广告词
2014/03/13 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
国家助学金受助感言
2015/08/01 职场文书
爱国教育主题班会
2015/08/14 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书