使用.htaccess禁用目录的所有CGI(php,perl,...)

Suz*_*ron 18 apache security .htaccess

我有一个用户可以上传文件的目录.

为了避免安全问题(例如有人上传恶意php脚本),我目前通过附加.data来更改文件的扩展名,但是在下载文件时,他们必须手动删除.data.

另一个常见的解决方案是将文件上传到Apache不提供的目录中,并使用php脚本通过调用来管理所有下载readfile().

我想做的是简单地禁止在upload文件夹中执行任何脚本(php,perl,cgi脚本,以及我将来可能安装的任何脚本).这个SO答案建议.htaccess在该文件夹的文件中添加以下行:

SetHandler default-handler
Run Code Online (Sandbox Code Playgroud)

但是,在我的情况下,这没有任何效果(我放在该文件夹中的示例php脚本仍然执行).我究竟做错了什么?

Apache配置

这台机器是运行的VPS(虚拟专用服务器)Debian GNU/Linux 6.0.7 (squeeze),据我所知(我记下我在该服务器上运行的所有命令,因此我的"内存"应该非常准确),我不会改变apache2中的任何内容配置,运行appart sudo apt-get install php5,以及/etc/apache2/sites-enabled/mysite.com使用以下内容创建文件:

<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>
Run Code Online (Sandbox Code Playgroud)

Suz*_*ron 33

把它放在你的.htaccess:

<Files *>
    # @mivk mentionned in the comments that this may break
    # directory indexes generated by Options +Indexes.
    SetHandler default-handler
</Files>
Run Code Online (Sandbox Code Playgroud)

但这有一些安全漏洞:可以在子目录中上传.htaccess,并覆盖这些设置,它们也可能会覆盖.htaccess文件本身!

如果你是偏执的,选项的行为将来会发生变化,请把它放在你的 /etc/apache2/sites-enabled/mysite.com

    <Directory /home/me/www/upload/>
            # Important for security, prevents someone from
            # uploading a malicious .htaccess
            AllowOverride None

            SetHandler none
            SetHandler default-handler

            Options -ExecCGI
            php_flag engine off
            RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
            <Files *>
                    AllowOverride None

                    SetHandler none
                    SetHandler default-handler

                    Options -ExecCGI
                    php_flag engine off
                    RemoveHandler .cgi .php .php3 .php4 .php5 .phtml .pl .py .pyc .pyo
            </Files>
    </Directory>
Run Code Online (Sandbox Code Playgroud)

如果无法修改apache配置,请将文件放在.htaccess具有以下目录结构的文件中:

/home/me/www/
          |- myuploadscript.php
          |- protected/
              |- .htaccess
              |- upload/
                  |- Uploaded files go here
Run Code Online (Sandbox Code Playgroud)

这样,没有人能够覆盖你的.../protected/.htaccess文件,因为他们的上传进入子目录.../protected,而不是protected自身.

AFAICT,你应该非常安全.

  • @Tilebeck虽然在文件上有一个`chmod 444`(只读)会阻止直接修改文件,但它不会阻止替换文件(删除它并创建一个新文件),因为[只涉及目录的权限在该操作中](http://unix.stackexchange.com/a/48580/19059),因此如果您不希望更改其内容,我建议不要依赖只读文件. (3认同)