2016-04-15 5 views
0

私はPHPとApacheの設定を学習しています。私はXAMPPのバージョン:5.6.19を使用しています。私はdefault.phpという名前のページを持っています。このページはヘッダー、フッター、およびそれらの間のコンテンツサブページを読み込みます。このコンテンツサブページは "content"という名前のフォルダに保存されます。 ?だから私は書くでしょうコンテンツのサブページを示すサイトにロードしますセキュリティApache/PHP、ルートおよび外部フォルダの問題にアクセスすることができます

<!--INCLUDE HEADER--> 
<?php include 'includes/header.php';?> 

<!--LOAD CONTET--> 
<?php 
/*if page is not set, redirect to index*/ 
if(!isset($_GET['page']) || strlen($_GET['page']) == 0) 
{ 
    header("Location: index.php"); 
    die(); 
} 
/*if page is set*/ 
else 
{ 
    /*search page on contet directory*/ 
    $page = 'content/'.$_GET['page'].'.php'; 

    /*if page not found on content directory, redirect to index*/ 
    if(!glob($page)) 
    { 
     header("Location: index.php"); 
     die(); 
    } 
    /*if page is found, load as subpage*/ 
    else 
    { 
?> 
    <main class = "<?php echo basename($page, '.php'); ?>"> 
     <?php include $page;?> 
    </main>  
<?php 
    } 
} 
?> 

<!--INCLUDE FOOTER--> 
<?php include 'includes/footer.php';?> 

はlocalhost/misite/default.phpページ=サブページ

そうするが、私はdefault.phpに次のようにコーディングされています

コンテンツフォルダのPHPファイルの読み込みを許可し、../トリックを実行することで他のフォルダへのアクセスを防止することが最も重要なので、誰かが試してみると結果は

デフォルト?page = ../.php

となり、代わりにインデックスページにリダイレクトされます。

SEF URLで同じ機能を試したときに問題が発生しました。私は、.htaccessファイルに次のようにコード化された:

RewriteEngine On 
RewriteBase /misite/ 
RewriteRule ^([a-zA-Z0-9-]*)$ default.php?page=$1 

だから私は

はlocalhost/misite /サブページを書くことができる可能性があり、パラメータ$ 1は今だろうと私は同じ結果を期待していましたdefault.phpの "page"パラメータの値と他のすべてが同じであることが予想されるので、私は別のフォルダにアクセスできるとは思っていませんでした。私は次のことをしようとしたときしかし:

localhostの/../

その結果、私はマイルのサイトフォルダの外に位置するページであるダッシュボードページ(ローカルホスト/ダッシュボード/)になった、と私は をしようとした場合localhost/.. img/iはimgフォルダにアクセスできます。 default.phpの条件付き検証も実行していないようです。

これはセキュリティ上の問題で、私がこれでハッキングする可能性があるかどうか心配です。なぜこのようなことが起こるのか分かりません。これがセキュリティ上の問題の場合、どうすれば修正できますか?

答えて

0

セキュリティ上のリスクは、この行を次のとおりです。

$page = 'content/'.$_GET['page'].'.php'; 

チェックしないで、あなたはどのような入力がglobへの後続の呼び出しを使用してディスクを検索することができます。相対パスが評価され、ユーザーがサーバー上の任意のPHPファイルを参照できるようになります。

あなたのPHPファイルのすべて1つのソリューションは

// Check "page" only contains letters, numbers, underscore 
if (!preg_match('/^\w+$/', $_GET['page'])) { 
    header("HTTP/1.0 404 Not Found"); 
    exit(); 
} 
$page = 'content/'.$_GET['page'].'.php'; 

次にあなたが$page内のパスが唯一のあなたのコンテンツディレクトリにPHPファイルを参照している確信することができている、深いディレクトリに「コンテンツ」内にあるとされていない場合。

+0

これは素晴らしいキャッチでした。ご助力ありがとうございます。その変更の後、アクセスはPHPの照会によってより安全であるようです。私はまだSEF URLフォーマット(localhost/mysite/..の相対パスの問題を抱えています/ - それは私をダッシュ​​ボードページに連れて行く)。しかし、私はそれがRewriteRuleのものにもっと関連していることに気づいただけです。私は自分の「宿題」を行い、私が自分自身を理解できない場合は別の質問に投稿します。私が学ぶのを助けてくれてありがとう:) – binario85

関連する問題