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 相关文章推荐
1.PHP简介
Oct 09 PHP
PHP新手上路(二)
Oct 09 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
php制作动态随机验证码
Feb 12 PHP
PHP 魔术变量和魔术函数详解
Feb 25 PHP
yii用户注册表单验证实例
Dec 26 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 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与SQL注入攻击[一]
2007/04/17 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
Python中作用域的深入讲解
2018/12/10 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
python实现转圈打印矩阵
2019/03/02 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
酒吧总经理岗位职责
2013/12/10 职场文书
实用的简历自我评价
2014/03/06 职场文书
工程催款通知书
2015/04/17 职场文书
生产实习心得体会范文
2016/01/22 职场文书
年终工作总结范文
2019/06/20 职场文书
golang实现浏览器导出excel文件功能
2022/03/25 Golang
一文解答什么是MySQL的回表
2022/08/05 MySQL