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实现小型站点广告管理
Oct 09 PHP
PhpMyAdmin中无法导入sql文件的解决办法
Jan 08 PHP
php microtime获取浮点的时间戳
Feb 21 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
Sep 11 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
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
php post换行的方法
2020/02/03 PHP
javascript读取xml
2006/11/04 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
微信小程序实现弹框效果
2020/05/26 Javascript
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
django缓存配置的几种方法详解
2018/07/16 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
大二学生学年自我鉴定
2014/09/12 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
JavaScript前端面试组合函数
2022/06/21 Javascript