PHP文件与图片防盗链处理类
防盗链就是对一些文件资源进行包装了,这样对方是看不到我们文件源地址了,下载是也是php文件打开了,下载成功之后就成了要下载的文件了,下面我来给各位分享一站长写的类。
悲剧,刚提交的既然服务器挂了没成功,又得重写....
这几天在写一个PHP防盗链外部资源下载处理函数,昨天晚上刚完成编写,中间遇到了些问题,这里就不详述了;
以下是自写的简单的PHP防盗链处理类(重新整理编写成类文件,以便后期改进);
<?php /** * * 防盗链外部资源下载处理类 * * @author 清风 <xrcc_bk@126.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}rnFileUrl = {$FileInfo['Content-Location']}rnFileSize = {$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.nn"); // 输出远程资源 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 = '/qq/QQ5.1/10055/QQ5.1.exe'; // 转跳地址 $Location = 'http://www.phprm.com'; // 许可来路域名列表 $allowUrl = array( 'blog.zhengshuiguang.com', ); $BurglarDow = new BurglarDow($dowUrl, $Location, $allowUrl); $BurglarDow->dow(); ?>
有何不足之处,还望访友们多指点指点;
教程网址:http://www.phprm.com/code/58379.html
欢迎收藏∩_∩但请保留本文链接。