Header img   

楚虽三户,亡秦必楚



PHP 防止文件盗链而读入内存之后下载

PHP 防止文件盗链而读入内存之后下载

给班级做作业管理系统,提供作业打包下载功能。但是因为盗链存在。。使得流量总是超出,导致网站停止。 我用的是万网的免费主机,当年活动免费申请的,免费使用两年。给了1G的空间和每月10G的流量。 我的网站的功能就是学生分别提交自己的作业,等时间差不多了,再由学习委员打包下载。 后来突然有一天邮件提醒我的流量使用超过了限制。。访问网页也提示流量耗尽了。 流量耗尽图片 其实我每月才交一两次作业,每个作业的大小大概是300k,一共50人。反正再怎么使用都不会超过10G的。。引起了我的怀疑。准备查查流量的报告。 流量使用报告 查到短短三天使用了10个G。。不现实啊。。。 再往下看,zip的下载量特别大。。。其实zip文件就是打包后学习委员下载的文件。 zip使用量最大 原因猜测。。由于文件的存在,学习委员下载后。。莫名的这个链接被某些未知人员得到。。疯狂的进行下载。。从而导致流量超出。下面就说说如何避免。 关于将文件打包的过程,可以自行百度得到,不再赘述。 先看看原来的代码:

$url = "http://***/Uploads/works/".$assignmentId.".zip";
echo "<head>
            <meta charset='UTF-8'>
      </head>
      <br/>
      <center> 
          <a href ='".$url."' target='"."_blank"."'>下载地址</a>
      </center>";

可见原来的代码是将文件地址拼接后形成下载链接的。这就容易盗链。 看一下更改后的代码:

$url = U('Assignments/downloading',array('assignmentId'=>$assignmentId,'showname'=>$showname));
echo "<head>
            <meta charset='UTF-8'>
      </head>
      <br/>
      <center> 
          <a href ='".$url."' target='"."_blank"."'>下载地址</a>
      </center>";

这里是显示出的不是文件地址,而是一个导向一个下载文件的也面,本代码中使用的是Thinkphp中的语法,array中是参数。 在downloading中的内容代码为:

$filename="./Uploads/works/".$assignmentId.'.zip';//定位文件地址
if(file_exists($filename)){
    $date=date("Ymd-H:i:m");
    header( "Content-type:  application/octet-stream "); 
    header( "Accept-Ranges:  bytes "); 
    header( "Content-Disposition:  attachment;  filename= ".$showname.".zip"); //设置下载的文件名
    $size=readfile($filename); //读入内存下载
    header( "Accept-Length: " .$size);//设置大小
    unlink($filename);//由于下载后就没用了,为了防止盗链,故下载后即删除
}else{
    echo "<head>  
            <meta charset='UTF-8'> 
          </head>
         <br/> 
         <center> 
             文件不存在 
         </center>";
}

由此,从此网站并不存在下载的文件,无法通过地址得到下载内容,即便访问也无法得到。



评论0

发表评论