web-dev-qa-db-ja.com

.htaccessを使用して、ディレクトリのすべてのCGI(php、Perlなど)を無効にします

ユーザーがファイルをアップロードできるディレクトリがあります。

セキュリティ上の問題(悪意のあるphpスクリプトのアップロードなど)を回避するために、現在、たとえば_.data_を追加してファイルの拡張子を変更していますが、ファイルをダウンロードするときに、手動で_.data_を削除する必要があります。

もう1つの一般的な解決策は、Apacheが提供していないディレクトリにファイルをアップロードすることです。また、readfile()を呼び出して phpスクリプトにすべてのダウンロードを管理させる を使用します。

私がしたいことは、アップロードフォルダー内のスクリプト(php、Perl、cgiスクリプト、将来インストールするものは何でも)の実行を単に許可しないことです。 このSO回答 は、そのフォルダの_.htaccess_ファイルに次の行を追加することを提案します:

_SetHandler default-handler
_

しかし、私の場合、これは効果がありません(そのフォルダーに入れたサンプルphpスクリプトはまだ実行されています)。何が悪いのですか?

Apacheの設定

マシンはDebian GNU/Linux 6.0.7 (squeeze)を実行するVPS(仮想プライベートサーバー)であり、覚えている限り(そのサーバーで実行するすべてのコマンドをメモしているので、「メモリ」はかなり正確であるはずです)、私はApache2の構成では何も変更せず、_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>
_
18

これを.htaccessに入れます:

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

しかし、これにはいくつかのセキュリティホールがあります。サブディレクトリに.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>

Apacheの設定を変更できない場合は、ファイルを.htaccessに次のディレクトリ構造で配置します。

/home/me/www/
          |- myuploadscript.php
          |- protected/
              |- .htaccess
              |- upload/
                  |- Uploaded files go here

このようにすると、アップロードはprotected自体ではなく.../protected/.htaccessのサブディレクトリに移動するため、.../protectedファイルを上書きすることはできません。

AFAICT、あなたはそれでかなり安全でなければなりません。

33

Godaddyのセットアップでは、httpd.confファイルを編集できません。また、php_flagコマンドは、phpの実装方法が原因で機能しません。

私はこれを.htaccessファイル:

SetHandler default-handler
AddType text/plain php

これを、FTPユーザーがアクセスを許可されている上のディレクトリに配置します。これにより、そのディレクトリ内のすべてのPHPファイルと、すべてのサブディレクトリがphpをプレーンテキストとして表示します。

これは、他のファイルタイプでも機能します。必要なのは、プレーンテキストで表示するように強制するファイルの拡張子を含む別の行を追加することだけです。 AddType text/plain cgi 例えば

1
Taylor