2009-07-06 20 views
2

私は自分のサイトにこのPHP動的インクルードコードを使用しています。しかし、私はそれがない安全で、どのようにこれを置き換えるために、より安全でより良いコードを書くことができると思う:安全な動的インクルード

$page = (empty($_GET['page'])) ? '' : $_GET['page'].".html"; 

if (empty($page)) 
{ 
$page = 'index.html'; 
} 

else 
{ 
$page = $page; 

} 

include($page); 

は、あなたがファイルをに含めることが許可されているかを決定するためにホワイトリストのいくつかの並べ替えを定義することができ、非常に

+0

これはかなりの重複です:http://stackoverflow.com/questions/4369/how- include-php-files-that-require-an-absolute-path – davethegr8

答えて

0

をありがとうこのファッションをチェックし、インクルードを行う前にリストをチェックしてください。

別の方法は、特定のディレクトリ(または子ディレクトリ)内のインクルードのみを許可し、要求されたファイルがそのディレクトリ内にあることを確認することです。

8

セキュリティに関しては、常に許可ポリシーは悪いポリシーです。要求が有効かつ安全であると想定しないでください。常に先行拒否、およびホワイトリストを使用します。

switch($_GET['page']): 
    case 'page-a': case 'page-b': case 'other-page': 
     include $_GET['page'] . '.html'; 
     break; 
    default: 
     include 'index.php'; 
endswitch; 

ホワイトリストを維持することが困難である場合は、単一のパスに可能性を狭めるためにしようと、ベース名を使用します。

$name = basename($_GET['page']); 
include 'includes/' . $name . '.html'; 

そうしないこの方法では、このディレクトリのすべての内容(およびすべてのインクルードパス)を安全に保つ限り(セキュリティ侵害されたファイルをそのディレクトリにアップロードする可能性があることに注意してください)、セキュリティに関する多くのことを心配する必要があります。

上記のエラーが発生した場合は、realpath()を使用して、指定したディレクトリツリーにファイルが存在することを確認してください。

0

$ページ内に無効なファイル文字(つまり、\ /:* <?)があるかどうかを確認し、phpのfile_exists()メソッドを使用してファイルが存在するかどうかを確認することをお勧めします。誰かがページパラメータに "http://example.com/unsafe_file" を入れたときに

$bad_chars = array("\\", "/", ":", "*", "?", ">", "<", "Foo", "Bar"); 
$file = str_replace($bad_chars, "", $file); 

if (!file_exists('/' . $file)) 
{ 
    echo 'bad file name'; 
} 
0

よう

何かがどうなりますか?あなたのスクリプトはおそらく外に出て、安全でないリモートのスクリプトをダウンロードし、そこで見つけたPHPコードを実行します。これには、とりわけ、あなたのサーバーを所有するための悪用が含まれる可能性があります。または、データベースのパスワードを印刷します。または機密情報を明らかにする。要するに、この種のインクルードは間違いなく安全ではなく、使用すべきではありません。

代わりに、ページのホワイトリストを使用して、それに対してパラメータを許可して確認するか、データベースからページの内容を取得する必要があります。しかし、ファイルを含めるだけでは使用できません。

0

一般に、私はincludeまたはrequireへの呼び出しを非正規化されたユーザー入力では行いません。それはあまりにも危険です。ユーザーがWebルートの外部にあるファイルを要求した場合はどうなりますか?

ホワイトリスト、またはincluderequireのような強力なコールにユーザーが入力する必要のないものを含めるかどうかを制限する必要があります。それ以外の場合は、自分自身をRemote File Inclusion attacksまで開きます。 allow_url_fopenを無効にすることにより、RFIを緩和する方法がありますが、状況を完全に回避することがベストです。

1

あなたは、ページ名は有害なものが含まれていないことを確認するpreg_replace()を使用することができます。

// $page can only contain letters, numbers and '_' 
$page = preg_replace('/[^a-zA-Z0-9_]/', '', $_GET['page']); 
include "pages/$page.html"; 
関連する問題