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 相关文章推荐
如何去掉文章里的 html 语法
Oct 09 PHP
php图片验证码代码
Mar 27 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
Nov 29 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
php cli模式下获取参数的方法
May 05 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
PHP中PDO事务处理操作示例
May 02 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 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 session_start()出错原因分析及解决方法
2013/10/28 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
javascript parseInt 大改造
2009/09/27 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
深入了解js原型模式
2019/05/30 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
python处理json数据中的中文
2014/03/06 Python
使用Python中的cookielib模拟登录网站
2015/04/09 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
设置python3为默认python的方法
2018/10/31 Python
python pandas生成时间列表
2019/06/29 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
基于python traceback实现异常的获取与处理
2019/12/13 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
详解python的变量缓存机制
2021/01/24 Python
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
地球一小时倡议书
2014/04/15 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
给校长的建议书范文
2015/09/14 职场文书
DE1107机评
2022/04/05 无线电