有关下载的看法
2008-01-15 15:31
148 查看
一、下载功能其实很好实现,原来直接将文件的地址直接放在a里就可以实现了。但是这样给系统的安全性带来了不少的隐患。怎样隐藏下载文件的真实地址?
有一种办法,其主要思想是:1.以二进制数据流方式打开欲下载文件。2.按二进制数据流读取,并输出3.输出的内容强制浏览器打开一个下载框,以便下载。
打开一个文件可以用fopen()方法,文件的路径在此方法中以参数的方式传入,这样便实现了隐藏文件真实路径的目的,而不是简单的用a将文件绝对路径暴露。下面是我写的一个简单的下载类:(重要部分已添加说明)
<?
class downLoad {
function downLoading($fileUrl,$fileName){
//判断文件是否存在
if($this->fileExists($fileUrl,$fileName)==false){
exit();
}
//获得文件大小
$fileSize = filesize($fileUrl.$fileName);
//已二进制方式打开文件
$objDownload = fopen($fileUrl.$fileName,"rb");
//发送header
header("Content-type:application/octet-stream");//设置文件类型为二进制数据流
header("Content-length:$fileSize");//文件大小
header("Content-Disposition: attachment;filename=$fileName");//提供推荐的文件名来强制浏览器弹出一个保存文件对话框。
fpassthru($objDownload);
}
function fileExists($fileUrl,$fileName){
$what = file_exists($fileUrl.$fileName);
return $what;
}
}
?>
二、虽然实现了文件路径的隐藏,但是还是感到不是十分的安全。
功能1、当该文件需注册后才能下载
session_start();
if(!isset($_SESSION["loginname"])){
echo "对不起,你无权下载!";
exit();
}else{
$do = new downLoad();
$do->downLoading("../download/file",$_GET["filename"]);
}
功能2.每个用户有自己的下载文件,其他用户不能下载。
功能1可以简单的过滤下载用户,但是只要存在session在url中输入其他文件地址就可以下载其他用户的任意文件了,不好。
失败案例1:我试着禁掉用户在url中输入下载地址:(http_referer为链接到该页的前一页地址,server_name为当前运行脚本所在服务器主机的名称。当前一页中以a链接至此页时http_referer有值,而当使用页面刷新、header、javascript时http_referer不存在!这三种方式在IE中不会视为事件使http_referer产生值!)
$serverName = $_SERVER['SERVER_NAME'];
$httpReferer = $_SERVER['HTTP_REFERER'];
$requestArray = explode("/",$httpReferer);
$requestSN = $requestArray[2];
if($httpReferer==""||$requestSN!=$serverName){
echo "非法链接!";
exit();
}
这样只有在用户在本站中有<a href=""></a>链接时才能下载该文件,其他网站的盗用或着url直接输入不会下载该文件。(假设本站不会提供其他用户资源的a链接,只提供该用户自己的资源链接地址)用户在想要非法下载其他用户的资源时,一般会在url中输入地址,这样貌似解决了功能2的需求,但是当使用迅雷工具下载时,在其提供的url输入地址却任然可以下载其他用户资源,这是因为,当以迅雷下载时,可以看做触发了a时间http_referer不为空!
2.其他思想:
想用户下载资源似有化貌似只能使该用户id对应自己相应的资源。
方法1.存储一个用户下载列表。当下载时比对。
方法2.使用标志位来命名资源。当下载是判断。
方法3.使用linux中的权限控制。(未实现)
以上纯属个人看法,忘大虾务笑。下载安全问题一直是块心病,倘若有更好的方法,还忘高人指教。小弟谢过。
有一种办法,其主要思想是:1.以二进制数据流方式打开欲下载文件。2.按二进制数据流读取,并输出3.输出的内容强制浏览器打开一个下载框,以便下载。
打开一个文件可以用fopen()方法,文件的路径在此方法中以参数的方式传入,这样便实现了隐藏文件真实路径的目的,而不是简单的用a将文件绝对路径暴露。下面是我写的一个简单的下载类:(重要部分已添加说明)
<?
class downLoad {
function downLoading($fileUrl,$fileName){
//判断文件是否存在
if($this->fileExists($fileUrl,$fileName)==false){
exit();
}
//获得文件大小
$fileSize = filesize($fileUrl.$fileName);
//已二进制方式打开文件
$objDownload = fopen($fileUrl.$fileName,"rb");
//发送header
header("Content-type:application/octet-stream");//设置文件类型为二进制数据流
header("Content-length:$fileSize");//文件大小
header("Content-Disposition: attachment;filename=$fileName");//提供推荐的文件名来强制浏览器弹出一个保存文件对话框。
fpassthru($objDownload);
}
function fileExists($fileUrl,$fileName){
$what = file_exists($fileUrl.$fileName);
return $what;
}
}
?>
二、虽然实现了文件路径的隐藏,但是还是感到不是十分的安全。
功能1、当该文件需注册后才能下载
session_start();
if(!isset($_SESSION["loginname"])){
echo "对不起,你无权下载!";
exit();
}else{
$do = new downLoad();
$do->downLoading("../download/file",$_GET["filename"]);
}
功能2.每个用户有自己的下载文件,其他用户不能下载。
功能1可以简单的过滤下载用户,但是只要存在session在url中输入其他文件地址就可以下载其他用户的任意文件了,不好。
失败案例1:我试着禁掉用户在url中输入下载地址:(http_referer为链接到该页的前一页地址,server_name为当前运行脚本所在服务器主机的名称。当前一页中以a链接至此页时http_referer有值,而当使用页面刷新、header、javascript时http_referer不存在!这三种方式在IE中不会视为事件使http_referer产生值!)
$serverName = $_SERVER['SERVER_NAME'];
$httpReferer = $_SERVER['HTTP_REFERER'];
$requestArray = explode("/",$httpReferer);
$requestSN = $requestArray[2];
if($httpReferer==""||$requestSN!=$serverName){
echo "非法链接!";
exit();
}
这样只有在用户在本站中有<a href=""></a>链接时才能下载该文件,其他网站的盗用或着url直接输入不会下载该文件。(假设本站不会提供其他用户资源的a链接,只提供该用户自己的资源链接地址)用户在想要非法下载其他用户的资源时,一般会在url中输入地址,这样貌似解决了功能2的需求,但是当使用迅雷工具下载时,在其提供的url输入地址却任然可以下载其他用户资源,这是因为,当以迅雷下载时,可以看做触发了a时间http_referer不为空!
2.其他思想:
想用户下载资源似有化貌似只能使该用户id对应自己相应的资源。
方法1.存储一个用户下载列表。当下载时比对。
方法2.使用标志位来命名资源。当下载是判断。
方法3.使用linux中的权限控制。(未实现)
以上纯属个人看法,忘大虾务笑。下载安全问题一直是块心病,倘若有更好的方法,还忘高人指教。小弟谢过。
相关文章推荐
- 常用的有关文件上传下载的框架和图片加载框架
- ˚F安全下载 - 到底什么人需要了解有关到F安全下载
- 与婚庆仪式有关的音乐(可下载)
- Android Studio的简介,图文的结合安装,Android Studio2.3.3最新版及其它有关文件下载
- 有关文件下载问题
- 有关多线程下载有关资料与总结
- Linux系统有关下载
- 对于下载需要积分的看法
- 有关Ubuntu11.04下Android2.3.7源码下载与编译
- 推荐几个国外有关linux桌面主题的下载站点!!
- 源码下载工具有关:git hg svn
- 使用httpclient 两个超时参数--与下载有关
- 2013.7.9 有关K60 JTAG下载
- 有关左值和右值,我的一些看法,可能不对,希望大神们指正!
- 有关cocoaPods的相关操作,使用cocoaPods下载第三方到具体工程
- 阅读有关软件工程与计算机科学区别的文章,谈谈你的看法。
- mule有关软件下载地址
- Java有关下载提示
- 有关软件开发中下载软件包的选择