2016-08-28 7 views
-2

url取得リクエストからロードする(ただcss,js)Webページを作成しました。includeでこれまでに行っていますが、public_htmlではないファイルをハッカーに含めることができるので危険です。file_get_contentsでこれを試してみました。私はそれが可能であると聞いたので、私はハッカーがPHPファイルを読むのを手伝ってほしくないと私はfile_get_contentsと聞いたので、実際に私はfile_get_content sが危険であると聞いたので、file_get_contentsでphpファイルを読むことは可能ですか?

+0

権限が与えられている限り、**任意の**ファイルを 'file_get_contents'で読むことができます。ホワイトリストを使用して、要求されたファイルと比較して、読み込みたいファイルだけが外に出ていることを確認する必要があります。 –

答えて

0

file_get_contents()は、ユーザー指定のデータをパラメータとして使用して出力を印刷すると危険です。悪質なユーザは、例えば、 /etc/passwdを入力すると、すべてのサーバーのユーザー名を読み取ることができます。または、名前に許可されたパス(たとえば "../../etc/passwd")を付けてもファイルにアクセスするにはファイル名の一部として '..'を使用できます。

ファイルシステムの予想される部分にファイル名やパスがあるなど、ユーザーが指定した値の有効性をチェックして、ユーザーがアクセスするファイルのみにアクセスするようにしてください。 PHPには、相対パス(またはシンボリックリンクを含むパス)を 'real'にする関数があります:realpath()

パスを '本当に'作成した後は、パスがファイルシステムの予期した部分にあるかどうかを確認してから、安全にfile_get_contents()に使用することができます。

$wanted = $_GET['path']; 
$real = realpath('/var/www/user/accessible/' . $wanted); 
if (strpos($real, '/var/www/user/accessible/') === 0) { 
    echo file_get_contents($real); 
} else { 
    throw new Exception('not allowed to access this file'); 
} 
+0

これはうまくいきましたが、私は確かに、file_get_contentを追跡し、public_htmlにないファイルを読み込む別の方法がありますか?また、このメソッドはlocalhost上では動作しません。実際はE:\ wamp64 \ www \ public \ css \ fonts \ google_fonts.cssである必要がありますが、それはwww/website /(別の/と\)である必要があります。 – Alex

+0

ファイルが../ の場合は常に空になるため、if(trim($ real)!= ''){ }のようにチェックできますか? – Alex

関連する問題