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调用Java对象的方法
Oct 09 PHP
十天学会php之第十天
Oct 09 PHP
关于php fread()使用技巧
Jan 22 PHP
PHP学习笔记之二 php入门知识
Jan 12 PHP
基于php-fpm的配置详解
Jun 03 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
php中Snoopy类用法实例
2015/06/19 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
收集前端面试题之url、href、src
2018/03/22 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
护士岗位职责
2014/02/16 职场文书
社区健康教育实施方案
2014/03/18 职场文书
班级出游活动计划书
2014/08/15 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
街道务虚会发言材料
2014/10/20 职场文书
李白故里导游词
2015/02/12 职场文书
支行行长岗位职责
2015/02/15 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python