首页 > php代码 > PHP文件与图片防盗链处理类

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

欢迎收藏∩_∩但请保留本文链接。

标签:fopen

相关文章

发表留言