8

拡張子がなくてもPHP経由でファイルを実行できることに気づきました.php。たとえば、拡張子がなくてもファイルをPHPでtest.xyz.php.whatever.zyx実行できます.php。たまたま.php.ファイル名に含まれているだけで、ApacheがPHPスクリプトを実行するのに十分です。

.htaccess私は(誰かが提案したように)これをそのフォルダのファイルに入れようとしました:

php_flag engine off

しかし、それは私のマシンでは機能しませんでした。

私が今知っている唯一の解決策は次のとおりです。

  • 既知のファイル拡張子に名前を変更します。これは、。などのPHP経由では実行されません.txt
  • ファイル名からすべてのドットを削除して、拡張子を付けないようにします。

しかし、これらのソリューションが私のWindowsサーバー(Apacheを使用)以外のサーバーでどのように機能するかはまだわかりません。

ファイル名の名前を変更する必要のない他の解決策はありますか?

4

10 に答える 10

5

完全に安全にするには、いくつかのことを行う必要があります。

アップロード ディレクトリを「public」フォルダの上に設定し、ブラウザからアクセスできないようにします。この設定は、php.ini (php 構成ファイル) にあります。これを有効にするには、Apache を再起動する必要があります。ほとんどの Redhat / Fedora / CentOS Web サーバーでは、次のようになります。

upload_tmp_dir = "/var/tmp/"

または、ローカルの Windows 7 WAMP インストールでは、次のように設定されています。

upload_tmp_dir = "c:/wamp/tmp"

.htaccess で、そのディレクトリ (c:/wamp/tmp) でのスクリプトの実行を無効にします。

RemoveHandler .php .phtml .php3
RemoveType .php .phtml .php3
php_flag engine off

PHP スクリプトで、アップロードされたファイルを取得し、MIME タイプ (ファイルタイプの拡張子ではない) に基づいてフィルター処理し、ファイル名を変更して、セキュリティで保護された一般にアクセス可能なフォルダーに配置します。さらに詳細に:

  • ファイルタイプのホワイトリストを作成します。例: 画像のみ (jpeg、png、gif、bmp)。これは、 mime_content_type() http://php.net/manual/en/function.mime-content-type.phpまたは新しいfinfo_file() http://us3.php.net/manual/en/functionを使用して実行できます。.finfo-file.php
  • 新しいファイル名を選択します。多くの場合、元のファイル名 + ソルト + タイムスタンプに基づくランダムな MD5 ハッシュを使用するのが最善です。
  • パブリック フォルダーに移動します。例: "c:/wamp/www/project_name/public/uploads"

ファイルタイプのフィルタリングを含む、Zend Framework などの MVC フレームワークを使用することをお勧めします。

これをすべて実行すれば、安全なはずです。特に古いシステムでは、PHP、MySQL、コマンドラインなどを標的とする無数のあいまいなエクスプロイトがあるため、明らかに 100% 安全ということはありません。大企業の Web サーバー (私が取り組んでいるもの) では、すべてを無効にし、プロジェクトに必要なものだけを選択的に有効にします。WAMP などのシステムを使用すると、すべてが可能になり、ローカル開発が容易になります。

プロのプロジェクトに取り組むための良い方法は、Rackspace または Amazon でクラウド サーバー アカウントを取得し、php.ini と httpd.conf 設定の構成方法、および PHP セキュリティのベスト プラクティスを学ぶことです。一般に、ユーザーの入力を信頼しないでください。入力が破損している、悪意がある、または形式が正しくないことを期待してください。そうすれば、最終的には安全になります。

于 2013-01-08T15:02:10.330 に答える
5

ユーザーによるアップロードの場合、この場合、ルート パスの上のレイヤーにフォルダーをアップロードすることをお勧めします (直接アドレス指定で) フォルダーをアップロードするには、あなただけがアクセスでき、攻撃者はこのフォルダー内のファイルにアクセスできません。したがって、攻撃者を無効にします。悪意のあるファイルを実行するアクション

于 2013-01-05T12:49:48.917 に答える
3

まず、ここで何が起こるかを理解する必要があります。

test.xyz.php.whatever.zyx

そのようなファイルは、それ自体では何もしません。追加された構成のみが、そのファイルで PHP を実行するように Apache に指示します。

したがって、その追加された構成を削除すると、Apache は.phpそこにあるものを見つけようとしなくなります - それが一番最後にあるのか、積み重ねられたファイル拡張子の一部であろうと。

phpサーバー構成で設定したハンドラーを確認してください。アップロード ディレクトリから削除します。これにより、アップロードされたファイルで発生する可能性のあるその他の構成の問題は解決されませんが、PHP ファイルは PHP によって実行されなくなります。

これが何についてなのかを知るのに問題がある場合は、PHP 構成をhttpd.confファイルと関連するシステムの Apache HTTPD 構成ファイルにポストする必要があります。

誰かがあなたに言ったディレクティブ.htaccess:

php_flag engine off

PHP を apache SAPI モジュールとして実行している場合にのみ機能します。

于 2013-01-05T20:56:32.327 に答える
1

個人的には、これが、どのような状況でもファイルを Web サーバーにアップロードしなくなった主な理由です。代わりに、S3 / Amazon SDK を使用して、アップロードされた一時ファイルを直接 S3 のバケットにプライベート アクセス許可で移動します (私は S3 を使用します。他の CDN も同様に機能します)。ファイルを Web クライアントで表示または表示する必要がある場合は、SDK と統合された一種の「ゲッター」関数を使用してファイルを取得し、表示します。

Web サーバーへのあらゆる種類のファイルのアップロードを許可するたびに影響を与える制御不能な変数が非常に多く存在するため、アクセス許可、フィルタリング、さらにはスペースの管理さえ困難になる可能性があります。S3 (またはその他の CDN) を使用すると、管理が非常に簡単になり、デフォルトですべてのファイルがサーバーから効果的に隔離されます。

于 2013-01-09T17:56:12.433 に答える
1

代わりにphp_flag engine off、単一のディレクトリの .htaccess ファイルを使用して、PHP ファイルのハンドラーを削除できます。

PHP を無効にしているディレクトリでは、.htaccess に以下を含める必要があります。

RemoveHandler .php .phtml .php3 .php4 .php5
RemoveType .php .phtml .php3 .php4 .php5

AddHandlerただし、デフォルトのApache構成で構成したタイプに応じて、以下を回避できる可能性があります。Windowsでは、これはC:\Program Files\Apache<version>\conf\httpd.conf

RemoveHandler .php 
RemoveType .php 

Directoryまた、メインの apache 構成ファイルで、.htaccess ファイルを含むディレクトリが設定されたステートメントでカバーされていることを確認する必要がありますAllowOverride FileInfoAllowOverride All他の目的で .htaccess ファイルを使用するかどうかを検討することをお勧めします。違いの説明については、AllowOverride の Apache ドキュメントを参照してください。

于 2013-01-02T21:54:36.413 に答える
0

単純な正規表現がその仕事をします

<?php
$a = strtolower($_FILES["file"]["name"]);
$replace = array(".php", ".phtml", ".php3", ".php4", ".php5");
$_FILES["file"]["name"] = str_replace($replace, "", $a);
?>

これはどのサーバーでも正常に機能します

于 2013-01-07T15:01:56.353 に答える
0

次の.htaccessコードは機能し、" " を含むファイルへのアクセスを拒否する可能性がありますphp:

<FilesMatch "php">
    Deny from all
</FilesMatch>
于 2013-01-08T15:46:05.070 に答える
0

私たちのサーバーで問題を簡単に再現できました。これを修正する方法があります。/etc/mime.types を編集して行をコメントアウトする必要があります。

#application/x-httpd-php                                phtml pht php
#application/x-httpd-php-source                 phps
#application/x-httpd-php3                       php3
#application/x-httpd-php3-preprocessed          php3p
#application/x-httpd-php4                       php4
#application/x-httpd-php5                       php5

これらの行により、名前に .php を含むものはすべて処理されます。mime.types のエントリをコメント アウトすると、/etc/apache2/mods-enabled/php5.conf の mod_php 構成に、.php で終わるファイルのみを正しく処理するこのエントリが含まれます

<FilesMatch "\.ph(p3?|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

本当に怖いのは、これがデフォルトの設定(私たちの場合はUbuntu 10.04)であることです。


編集

Windows では、mime.types ファイルは apache_home/conf/mime.types にある必要があります。

于 2013-01-08T02:57:30.073 に答える
0

これは本当に良い答えではありませんが、いくつかの特別な場合に役立つことを願っています...

.htaccess次のようにファイルで mod_rewrite を使用できます。

RewriteRule ^(.+).xyz.php.whatever.zyx$ index.php?openfile=$1 [NC,L]

そしてあなたのindex.phpファイルの中に:

$file = secure_this_string($_GET['openfile']);
include($file.'.xyz.php.whatever.zyx');  # or some other files

セキュリティ上の理由から、この回答を必ず確認してください

およびtest.xyz.php.whatever.zyxファイル内:

<?php echo 'hello';

クライアントが /test.xyz.php.whatever.zyx ファイルを要求した場合、出力は「hello」になるはずです

于 2013-01-02T22:10:21.980 に答える