PHP 防止文件盗链而读入内存之后下载
给班级做作业管理系统,提供作业打包下载功能。但是因为盗链存在。。使得流量总是超出,导致网站停止。 我用的是万网的免费主机,当年活动免费申请的,免费使用两年。给了1G的空间和每月10G的流量。
我的网站的功能就是学生分别提交自己的作业,等时间差不多了,再由学习委员打包下载。
后来突然有一天邮件提醒我的流量使用超过了限制。。访问网页也提示流量耗尽了。
其实我每月才交一两次作业,每个作业的大小大概是300k,一共50人。反正再怎么使用都不会超过10G的。。引起了我的怀疑。准备查查流量的报告。
查到短短三天使用了10个G。。不现实啊。。。
再往下看,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>";
}
由此,从此网站并不存在下载的文件,无法通过地址得到下载内容,即便访问也无法得到。