我最近的任务是打开一个小型网站的子域,允许受信任的用户上传和存储文件作为备份远离本地磁盘。通常,这个新的子域将主要用于存储静态Office类型的文档(例如Microsoft / OpenOffice文档,PDF,纯文本文件等)。
我想确保一个天真的用户无意中上传一个可能致命的文件,例如物理上可能的机会很少(或者实际上,尽可能少)。一些讨厌的PHP脚本。理想情况下,我想关闭PHP和其他任何可能存在安全风险的问题(CGI流程,服务器端包含等)。
我只是想知道,如果的堆栈溢出的社区可以帮助回答以下问题:什么是关闭与动态/可执行代码处理所有类型的文件/进程的最佳途径,那么实际上子域只不过是一个基本的静态文件服务器?
我使用各种关键字/短语在Google上看过,但我似乎无法找到一个很好的参考,使子域“安全”,因为可以从具有共享服务器权限级别的人那里做到。
该网站在典型的LAMP架构上运行在Apache 2.2上,并托管在第三方共享服务器上。
我 DO 可以访问:
.htaccess
(具有典型权限/限制的目录级别)php.ini
和.user.ini
(具有典型权限/限制的目录级别)我不有权访问:
httpd.conf
php.ini
(应用程序服务器级别)mysql.cnf
请注意,我没有资源只投资文件服务器或将其外包给第三方服务。此外,该服务器不会用于CDN意义上,因此性能不是真正的问题。
(另外,我不知道可以对客户端脚本做些什么,例如JavaScript / VBScript,但欢迎任何建议。)
提前致谢!
答案 0 :(得分:1)
简单。不提供对文件的直接访问。通过PHP脚本运行一切,该脚本将内容提供为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号而不是用户提供的文件名将文件存储在驱动器上,则可以获得更高的安全性。网络服务器可能会尝试执行nastyscript.php
,但如果它只是驱动器上的12345
,则服务器将不知道如何处理它。