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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
php下把数组保存为文件格式的实例应用
Feb 08 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
PHP将XML转数组过程详解
Nov 13 PHP
PHP反射机制用法实例
Aug 28 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
php使用QueryList轻松采集js动态渲染页面方法
Sep 11 PHP
PHP 8新特性简介
Aug 18 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 第二节 数据类型之字符串类型
2012/04/28 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
自己的js工具 Event封装
2009/08/21 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
一步步教你用Python实现2048小游戏
2017/01/19 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
python opencv之分水岭算法示例
2018/02/24 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
Python 项目转化为so文件实例
2019/12/23 Python
Python调用飞书发送消息的示例
2020/11/10 Python
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
小加工厂管理制度
2014/01/21 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
法定代表人证明书
2014/11/28 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS