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>";
}

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值