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 相关文章推荐
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
php递归实现无限分类的方法
Jul 28 PHP
PHP读书笔记_运算符详解
Jul 01 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
ThinkPHP实现登录退出功能
Jun 29 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 PHP
php微信公众号开发之秒杀
Oct 20 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
PHP7修改的函数
Mar 09 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基于自定义函数记录log日志方法
2017/07/21 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
2017/08/18 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
Python入门必须知道的11个知识点
2018/03/21 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
Araks官网:纽约内衣品牌
2020/10/15 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
教师求职推荐信范文
2013/11/20 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
普通党员对照检查材料
2014/08/28 职场文书
英语感谢信范文
2015/01/20 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
pytorch中的 .view()函数的用法介绍
2022/03/17 Python