通过.htaccess防止主题被他人下载

最近各种忙啊,今晚12点才把今天的工作做完。
刚准备睡觉,JASKNI就在QQ上跟我说我的ifancy主题在某些主机上可以通过绝对路径被下载。这源于WordPress自身的一个问题,在后台直接上传安装了主题或者插件之后,都会被保存到/wp-content/uploads/目录里。我忽然意识到难怪那天登录某人的FTP的时候,里面也是有各种他安装过的主题被在/wp-content/uploads/目录中。通过绝对路径就可以下载到这些文件。而我甚至之前傻乎乎的提醒过ifancy的客户为了安全应该通过后台安装….笨到家了真是。

这里有一篇文章可以了解到更多这些信息


看来WP的开发者也不是一般的2,干嘛要把后台安装的主题保留一份在uploads目录里…. 同时JASKNI还提到一个关于目录被直接打开的问题。就是访问xxx.com/wp-content/uploads/,可以直接显示这个目录中的所有文件夹和文件列表。(这只在某些主机上可以做到)

当然,对于主题上传的问题,你也可以选择直接删除所有ZIP文件,然后以后不再通过后台直接安装的方式进行安装,但这显然不是本文讨论的核心。这个问题不解决,怎能解我心头之忧,所以现在已经是凌晨2点50分了,还是撑着写个简单的教程吧。那就是通过.htaccess来定义规则并解决问题。长期使用解压文件夹再进行FTP上传安装主题的请无视此教程。

注意:必须是linux系统的主机才能使用这个方法(windows主机是否可以我不知道,没试验)

 

步骤一

新建一个文本文档,名称设置为xxx.htaccess

步骤二

在文本文档里面输入以下内容

<FilesMatch ".(zip|htaccess|htpasswd|ini|php|sh)$">
Order Allow,Deny
Deny from all
</FilesMatch>
Options -Indexes
order deny,allow

这里使用了FilesMatch规则来控制,其中第一行就是代表禁止访问的文件类型,例如zip。这样就不能通过直接路径访问任何带有.zip后缀的文件。下面的则是状态控制。为了其他的安全考虑,这段规则中还禁止了.htaccess,.php等文件类型的访问。

那么要是想上传压缩过的文件提供给别人下载怎么办?  Good quetion! 很简单,不上传zip,上传rar就行了..或者7z也可以。这里只禁止了zip,是因为无论是WP主题还是插件,后缀名都是zip的。

最后两行则是禁止目录直接访问,也就是如果该目录没有index,则会返回禁止访问的状态。反之则返回index的文件。

步骤三

使用FTP,上传这个文本文档到/wp-content/uploads/里,并将其名称改为.htaccess
这时该文件就仅针对uploads这个文件夹和它的子文件夹起作用,其他的文件夹则不会受到影响。换言之,你要是特别想上传zip文件的话,上传到除uploads及其子目录之外的其他任何目录都可以。

步骤四

在uploads文件夹里任意上传一个zip文件,然后通过http://www.xxx.com/wp-content/uploads/xxx.zip的方式进行测试,看是否能够下载。如果已经不能够下载,将返回404错误提示。那么恭喜你,成功了!

同时,请再访问http://www.xxx.com/wp-content/uploads/,测试目录列表是否可以被打开,如果不可以,恭喜你,又成功了!

步骤五

如果你在步骤四中发现了问题,那么联系你的主机商或者管理员。我目前是在小邓主机和衡天主机上测试通过,但庙的主机却只可以禁止目录访问但无法限制文件访问类型,初步估计是主机的个例,具体原因要我咨询了庙的管理员大猫之后才见分晓。

 

扩展阅读

你还可以将
Options -Indexes
order deny,allow
将上面这两段内容写到你的WP的根目录的.htaccess中,他可以帮助你防止全站的目录文件列表被偷窥。

当然你也可以使用更改WP文件上传目录的方式来达到防止偷窥和被下载的问题,但这个方法只适合刚建立的博客,并且仍有可能被其他方式扫描到你更改后的目录,因此并不推荐。

另外可以阅读更多关于.htaccess的使用方法供参考。

注意:.htaccess里只能使用英文符号,我之前捣鼓了2个小时都没成功,纳闷死了,怎么会这样呢。后来突然发现有一个双引号用了中文符号…所以不起作用,囧死。悲剧死悲剧死。

 

这个方法并不算完美,希望WordPress能在未来的版本更新中彻底解决这个问题吧,不明白为什么WP要设定为上传后的主题会自动存放zip到uploads目录里,好看还是好玩?
防止主题泄露,人人有责

135 天前