“按月存放”附件时,如何防止恶意用户列表显示? Unknown 2009/05/10

| |

这个话题稍显得深入了一点,因为这需要你有一定的PHP/linux经验。

Bo-blog里对上传的附件有两种选择:a)按月存放;b)存放在同一文件夹下。同时使用“按月存放”功能时,服务器必须允许PHP创建目录,且必须允许PHP对创建的目录进行写入。部分虚拟主机、运行于安全模式下的Linux主机有可能无法正常使用此功能。

下面我来谈谈现在是什么问题,以及如何解决问题。

一、为什么要使用按月存放的方式来存放附件?

因为按月存放时,Bo-blog会按月份建立目录,每月一个目录,如本月为/blog/attachment/200905/,下月为/blog/attachment/200906/。这样做,一来显得比较清楚,这个附件是什么时候上传的;二来备份时方便,你只要备份新的目录,旧的目录就不用重复备份了,因为他们不可能会有更新。

其实第二点才是我选择按月存放的主要原因。

二、目前按月存放出现了什么问题?

目前我使用的空间为Linux Server+Apache Web Server+PHP Module+MySQL DB Server(均是免费的)。当Bo-blog每到一个新的月份时,会新建一个该月的目录。熟悉Apache的用户知道,某一个目录有很多目录属性,Indexes即是一种。当某目录带有Indexes时,用户访问某目录时,会自动将目录下的文件全都以列表显示,用户会看到下面都有些什么文件(除非该目录下DirectoryIndex设为index.php、index.html,且此目录正好存有index.php/index.html)。

三、解决问题的思路

当然我可以选择更改目录的属性,可惜这个属性在根目录的阶段就被限制了,我没办法更改(免费的服务器,也是没办法)。那我为了防止服务器自动列出当前目录下的文件,我该怎么办?

上面蓝色的字体就是解决方案:让Bo-blog新建目录的同时,新建一个index.php或index.html。

四、具体解决问题的做法

找到/blog/admin/cp_upload.php,查看第45行,加上一行:else touch($targetfolder."/index.php");

touch是linux下的命令,可用于新建某一个文件。

if ($mbcon['uploadfolders']=='1') {
$targetfolder_ym=date("Ym").'/';
$targetfolder="attachment/{$targetfolder_ym}";
if (!is_dir ($targetfolder)) {
$mktargetfolder=@mkdir($targetfolder, 0777);
if (!$mktargetfolder) print_upload ($lna[974]);
else touch($targetfolder."/index.php"); // 加上此行。
}
}

上面语句的意思是,如果失败,显示$lna[974]。我加了一句在后面:否则(如果成功),新建$targetfolder/index.php.

呵呵,问题解决了。

其实要严密点的话,还要考虑如果已经存在index.php的话,如何解决。不过这种细节我就不考虑了。

请给这篇日志评个分吧~!

本文评分: 4.2/10 (24 votes)    提示:您还未对本文评分,您可以进行评分并发表您的意见!

加入收藏!

发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [注册]