2009-06-26 9 views
0

私は友人のための小さなサイトを作っています、noobfriendlyなので、簡単にページを追加できます。 私はindex.phpにすべてを含めるつもりだと思います。だから彼女はちょうど/pages/という名前のフォルダにページをドロップすることができます。

のindex.php

if (preg_match('/[a-zA-Z]/', $_GET['page'])){ 
$page = 'pages/'.$_GET['page'].'.php'; 

if ($page) { 
include $page; 
} else { 
exit; 
} 

} else { 
include('pages/home.php'); 
} 

これはかなり安全に右でありますか?私はアルファベットだけを許可しています。私はgoogleのような大きなサイトにはならないということです。まあ私はちょうどホビーコーダーなので、私はみんなに確かめるように依頼しています:)

あなたはどう思いますか?

+0

あなたの正規表現では、少なくとも1つの文字が[a-zA-Z]であり、他のすべての文字を自由に無視できることを確認するだけです – Cheekysoft

答えて

1

号/../../../も正規表現

使用'/^[a-zA-Z]+$/'

以前に何もして許可される文字の配列の後がないことを確認してください。この方法が一致します。

3

あなたの正規表現は/^[a-z]+$/iであることを確認し、これを確保するためにthis.

ctype_alnum($_GET["page"]); 
2

を使用することができます。これはアルファベットのみであることを確認するために、文字列全体(^は開始点、$は終了点)をチェックします。その後、あなたの仕事は安全です(少なくともこの部分では)。

1

入力する前にいくつかのチェックを実行することをお勧めします。 1つは、インクルードする前にis_file($ filename)を実行することです。

もう1つのことは、あなたの正規表現は1文字だけを許容するように設定されています - おそらくあなたが望むものではないでしょう。別のこと:前のポスターが指摘したように、正規表現は入力が正常かどうかをチェックするだけです。その後、_GET変数を使用します。あなたは上記の問題を避けるために、preg_matchの結果を使用しなければなりません(結果を配列に割り当てることができます)。

よろしく

0
preg_match('/[a-zA-Z]/', $_GET['page'], $match) 

if ($match) { 
    $page = "pages/$match.php"; 
    if(file_exists($page){ 
     include $page; 
    } else { 
     include "pages/404.php"; 
    } 
} else { 
    include "pages/home.php"; 
} 

たぶん偽 は? 'page''blabla89349'に設定されている場合、これはページ'blabla.php'を含むでしょう。それがあなたが意図したものなのかどうかわからないのですか?そうでなければ、あなたはそれについて厳しいかもしれないと

if ($match == $_GET['page']) { 
... 
1

私は実際のパスに文字列を編集し、あなたが悪用される可能性がどのようなブラウザやファイルシステムの癖を知っていることはありませんREGが好きではありません。あなたが本当にすべきことは、実際に入力を使用するのではなく、有効なファイル名をチェックするためにそれを使用することです。

globまたはscandirを使用してpagesディレクトリ内のファイルのリストを取得し、次にin_arrayを使用して、要求された文字列がファイルであるかどうかを確認します。あなたがパス要素を取り除こうとすると、あなたは自分自身を間違えたままにしておきます。