我最近的任务是打开一个小型网站的子域,允许受信任的用户将文件作为备份从本地磁盘上传和存储。一般来说,这个新子域将主要用于存储静态Office类型的文档(例如Microsoft/OpenOffice文档、PDF、纯文本文件等)。
我想确保天真的用户不会无意中上传一个可能致命的文件,例如一些讨厌的PHP脚本。理想情况下,我想关闭PHP和任何其他可能存在安全风险的东西(CGI进程、服务器端包含等)。
我只是想知道Stack Overflow社区是否有助于回答以下问题:关闭所有处理动态/可执行代码的文件类型/进程的最佳方法是什么,因此子域实际上只不过是一个基本的静态文件服务器
我在谷歌上使用了各种关键词/短语,但我似乎找不到让子域"安全"的好参考,因为它可以从具有共享服务器权限级别的人那里做到。
该网站在Apache 2.2上运行,采用典型的LAMP架构,并托管在第三方共享服务器上。
我DO可以访问:
.htaccess
(具有典型权限/限制的目录级别)php.ini
和.user.ini
(具有典型权限/限制的目录级别)- 控制面板软件,具有一些相当丰富的选项和功能(cPanel X)
- 相当灵活的网络主机,提供卓越的技术支持服务
我不能访问:
- root访问(显然!)
httpd.conf
php.ini
(应用服务器级别)mysql.cnf
请记住,我没有资源只投资于文件服务器或将其外包给第三方服务。此外,该服务器不会在CDN意义上使用,因此性能并不是一个真正的问题。
(此外,我不知道如何处理客户端脚本,例如JavaScript/VBScript,但欢迎提出任何建议。)
提前感谢!
简单。不要提供对文件的直接访问。通过PHP脚本运行EVERYTHING,该脚本将内容作为application/octet-stream
提供。例如
<?php
$id = $_GET['id'];
$data = get_file_details_from_database($id);
if (user_is_allowed_to_access($id)) {
header('Content-type: application/octet-stream');
readfile($data['path_to_file_on_server']);
}
有了这个,他们上传什么样的文件根本不重要——它永远不会通过直接的http://example.com/nastyfile.php
类型的URL直接访问。如果你只使用文件的内部ID号而不是用户提供的文件名将文件存储在驱动器上,你会获得更多的安全性。Web服务器可能会尝试执行nastyscript.php
,但如果驱动器上只有12345
,服务器将不知道该如何处理它