ユーザーがファイルをアップロードできるディレクトリがあります。
セキュリティ上の問題(悪意のあるphpスクリプトのアップロードなど)を回避するために、現在、たとえば_.data
_を追加してファイルの拡張子を変更していますが、ファイルをダウンロードするときに、手動で_.data
_を削除する必要があります。
もう1つの一般的な解決策は、Apacheが提供していないディレクトリにファイルをアップロードすることです。また、readfile()
を呼び出して phpスクリプトにすべてのダウンロードを管理させる を使用します。
私がしたいことは、アップロードフォルダー内のスクリプト(php、Perl、cgiスクリプト、将来インストールするものは何でも)の実行を単に許可しないことです。 このSO回答 は、そのフォルダの_.htaccess
_ファイルに次の行を追加することを提案します:
_SetHandler default-handler
_
しかし、私の場合、これは効果がありません(そのフォルダーに入れたサンプルphpスクリプトはまだ実行されています)。何が悪いのですか?
マシンは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>
_
これを.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、あなたはそれでかなり安全でなければなりません。
Godaddyのセットアップでは、httpd.confファイルを編集できません。また、php_flagコマンドは、phpの実装方法が原因で機能しません。
私はこれを.htaccess
ファイル:
SetHandler default-handler
AddType text/plain php
これを、FTPユーザーがアクセスを許可されている上のディレクトリに配置します。これにより、そのディレクトリ内のすべてのPHPファイルと、すべてのサブディレクトリがphpをプレーンテキストとして表示します。
これは、他のファイルタイプでも機能します。必要なのは、プレーンテキストで表示するように強制するファイルの拡張子を含む別の行を追加することだけです。 AddType text/plain cgi
例えば