我有一个目录,用户可以在其中上传文件。
为了避免安全问题(例如某人上传恶意php脚本),我目前通过添加 .data
来更改文件的扩展名,但是当下载文件时,用户必须手动删除 .data
。
另一个常见的解决方案是将文件上传到不被Apache服务的目录中,并通过调用 readfile()
的方式,让一个php脚本管理所有下载。
我想做的是简单地禁止在上传文件夹中执行任何脚本(php、perl、cgi脚本或者未来可能安装的任何其他脚本)。这个SO答案建议在该文件夹中的.htaccess
文件中添加以下行:
SetHandler default-handler
但在我的情况下,这没有任何影响(我放在那个文件夹中的示例PHP脚本仍然被执行)。我做错了什么?
Apache配置
这台机器是一台VPS(虚拟专用服务器),运行着Debian GNU/Linux 6.0.7 (squeeze)
,就我所记得的(我记录了我在该服务器上运行的所有命令,所以我的“记忆”应该相当准确),我除了运行sudo apt-get install php5
和创建文件/etc/apache2/sites-enabled/mysite.com
外,没有修改过apache2的配置,该文件的内容如下:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName mysite.com
ServerAlias www.mysite.com
DocumentRoot /home/me/www/mysite.com/www/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/me/www/mysite.com/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/sites-enabled/mysite.com
中,我的DocumentRoot
设置为/home/me/www
,文件/home/me/www/subdir/.htaccess
包含一行SetHandler default-handler
,并可由www-data
读取(我使用sudo su www-data; whoami; cat /home/me/www/subdir/.htaccess
进行了检查),所以我怀疑问题与AllowOverride
或类似的内容有关。 - Suzanne Soy/etc/apache2/sites-enabled/mysite.com
中),发现唯一能禁用PHP脚本的方法是放置<Directory /home/me/www/subdir/> php_flag engine off </ Directory>
,甚至不需要使用RemoveHandler .php .php3 .php4 .php5 .phtml
。这意味着对我来说,PHP似乎会绕过SetHandler指令。不幸的是,这意味着如果有一天我安装了另一个CGI引擎,例如perl
,那么我也需要记得将其禁用,因此使用php_flag engine off
绝对不是一种可靠的禁用文件夹内脚本执行的方法。 - Suzanne SoySetHandler
绝对是更强大的解决方法。我尝试过了,它对我有效,不确定为什么它对你无效。 - anubhava/etc/apache2/sites-enabled/mysite.com
中的<Directory>
指令里,但是还是没有用。最终我找到了解决方案:指令被应用于目录本身(这就是为什么当访问该目录时出现404
错误),而不是其内部的文件,所以我必须写上<Files *>SetHandler default-handler</Files>
,在这种情况下指令会递归地应用于文件夹本身、其中的文件和任何子文件夹。感谢所有的帮助! - Suzanne Soy