2017-05-07 9 views
1

PHPのローカルファイルインクルード攻撃を防ぐため、1つのディレクトリ内のすべてのPHPファイルの実行を完全に無効にします。 .htcaccessファイル内の行php_flag engine offを使用すると、500エラーが発生します。 another questionによると、これはPHPのインストール方法によるものです。1つのディレクトリでPHPの実行を無効にする

PHPのインストールを変更できない場合、PHPの実行を阻止する他の方法はありますか?

更新:ファイルの末尾に.phpが付いていません。

+0

それで、あなたは、ユーザーがそのディレクトリにPHPファイルにアクセスしたときに発生しますか?あたかもそれがプレーンテキストファイルであるかのように戻ってきましたか? – rickdenhaan

+0

拡張子が '.php 'のファイルのみです。 – Croises

+0

とにかくユーザーがファイルに直接アクセスすることはできません。私はちょうど他のPHPファイルから実行することができないので、それに加えてすべてのファイル(.phpの終わりを持つものだけでなく)の実行を防止したいだけです。 – kot

答えて

2

あなた.htaccessファイル

<FilesMatch \.php$> 
    SetHandler None 
</FilesMatch> 
+0

'.php'ファイルがHTTP経由で直接要求された場合、この(唯一の)コード実行を防ぎます。 'include()' dであるか、あるいはサーバ上の他のスクリプトによって呼び出されたPHPファイルがそのディレクトリで実行されることを必ずしも妨げません。 – MrWhite

+0

私の質問が更新され、ファイルにPHPの終わりがないことが明らかです。この回答を修正して、ファイルからすべてのハンドラを削除できますか?私がファイルを使ってやりたいことは、それらを作成、読み込み、削除することだけです。彼らは決してアクセス可能でも実行可能でもありません。 – kot

+0

PHPはコンパイルされずに解釈されるため、読み込みと実行可能に違いはありません。 –

-1

にこれを追加します。これは、あなたが「すべて許可を経由してサイトを構築しているphp

defined('BASEPATH') OR exit('No direct script access allowed'); 
+0

このコード(またはSimiliarコード)は、ライブラリとインクルードファイルに適しています。しかし、ファイルがユーザ生成コンテンツである場合(PHP Handslerをオフにしたい通常の場合)は役に立ちません。 – eckes

+0

これを生成されたコンテンツに含めることをお勧めします。彼はPHPの実行を防ぐために "その他の方法"であるかどうかを尋ねています。 – Eyy

+1

攻撃者に実行できないPHPスクリプトのみをアップロードするように指示するのはいくぶん難しいので、私は思います。 – eckes

0

の直接の実行を防ぐことができます、<?phpヘッダーの下にこれを追加し、論理を拒否します。あなたはそれを "すべて拒否してから許可する"というロジックで構築するべきです。たとえば、すべてのファイルに特定のディレクトリを提供するようにApacheに指示してから、そのディレクトリ内の一部のファイルを提供しないようにApacheに指示するためにその設定を上書きします。

<VirtualHost *:80> 
    ServerName foo.com 
    DocumentRoot "/path/to/files" 
</VirtualHost> 

ディレクトリレイアウトでは、このような:つまり、あなたはおそらくこのような何か持っているこの設定で

/path/to/files 
    index.php 
    config.php 
/path/to/files/lib 
    db.php 
    etc.php 
    other_thing.php 

を、誰でもリクエストすることができ、あなたがしようとしているものですhttp://foo.com/config.phpまたは直接http://foo.com/lib/etc.php、防ぐ。あなたが拒否したいすべてのものに対して個々の例外を追加するのではなく、逆に始めてください。つまり、サービスを受けたくないファイルがある場合は、を文書ルートに入れないでください。

<VirtualHost *:80> 
    ServerName foo.com 
    DocumentRoot "/path/to/files/public" 
</VirtualHost> 

ここで、DocumentRootはプロジェクト内のサブディレクトリに設定されています。公共の資産のみをこのディレクトリに入れます。他のすべてのファイルは公開されているため、にははApacheに対応できませんが、PHPに含めることはできます。

/path/to/files 
    config.php 
/path/to/files/lib 
    db.php 
    etc.php 
    other_thing.php 
/path/to/files/public 
    index.php 
+0

ありがとうございますが、私はこれが他のPHPファイルの包含の問題を解決するとは思わない。私は公共のアクセスを止めたいだけではありません、私はすでにそれをしました。私は明示的にphpファイルが実行されないようにしたい(例えば、他のPHPファイルで 'include()'を使用する) – kot

+0

あなたはそれを行うことはできません。彼らはあなたのアプリで実行するために読めるようにする必要があります。 –

+0

私はそれらが私のアプリで実行されないようにします – kot

関連する問題