2012-03-26 5 views
0

私はconf.phpファイルを持っている:キャレット( '^')を使用して、PCRE Regexの構文でファイル/フォルダを一度だけ除外しますか?例えば

$GLOBALS["no_access"] = '^forbidden|restricted|xampp|apache\_pb'; 

ビューからこれらのファイル/フォルダを遮断し、これらの文字列(フォルダ/ファイル)限られた回数を制限したいと思います。これはイントラネットプロジェクトであり、私が利用したいファイルやフォルダと同じ名前でアクセスしたくないフォルダがあるかもしれないからです。また、最初のインスタンスを選択することは可能ですか?

これは、ファイルマネージャであるeXtplorerと呼ばれるJoomlaのコンポーネントを変更するためのものです。

+2

(例えばディレクトリリストのような)行の先頭に一致します。しかし、 '|'は優先順位が非常に低いので、 '^ a | b'は' 'a''または' b''を意味し、* ''^a'や '^ b'"を意味しません。つまり、文字列の先頭にないときでも 'b'と一致します。おそらく ''禁止されています^^制限されています^ xampp |^apache_pb' 'です。 – ruakh

+2

この場合、 '^'は文字クラスの否定ではなく、文字列の先頭をマークすると考えています –

+0

正規表現には複数文字の否定がありません。あなたは否定的な先読みを使ってあなたが望むものを得ることができるかもしれません。 – ThiefMaster

答えて

2

どちらの方法でも動作しますが、ホワイトリストはブラックリストの代わりに安全です(xで始まるディレクトリにしかアクセスできません)。

文字列の先頭がフォルダに一致する特定のパターンで始まるかどうかを確認するために使用できる正規表現は何ですか?このようになります。PHPで

$regex = '/^(?:forbidden|restricted|xampp|apache_pb)/i'; 

function startIsRestricted($string) { 
    return preg_match('/^(?:forbidden|restricted|xampp|apache_pb)/i', $string); 
} 

編集

その議論を読んで、あなたがフォルダへのアクセスを制限したいより多くのように聞こえます。その場合は、htaccessとhtpasswdのドキュメントを参照してください。the apache websiteまたはthis websiteにあります。その全体が少しずつ入ります。

PHPでの制限は安全ではありません。 。

編集2

コードみかんをテストしています。少なくとも私は配列マップ(duh)と固定された明白なスペルミスをarroundします。

しかし、それは、少なくともあなたは、文字列内の各ディレクトリに対して再帰的には、このチェックを行うことができますどのように良いアイデアを与える必要があります...

/** 
* Function to check an entire string recursively to see if dissalowed directories are present 
* Assuming the string seperator will be a forwardslash 
* 
* @param string $string String to be evaluated against the dissalowed directory list given or else default 
* @param array $dissallow array of strings which are forbidden to be at the start of any of the directories 
* @param string $sep The seperator for the directory levels 
* 
* @return string 
*/ 
function test_directory ($string, array $dissallow = array('forbidden', 'restricted', 'xampp', 'apache_pb'), $sep = '/') { 
    $regex = '/^(?:' . implode('|', array_map ('preg_quote', $dissallow)) . ')/i'; 
    $dirs = explode($sep, $string); 

    foreach($dirs as $dir) { 
     // true will mean a match is found and thus present in the beginning of a directory in $string 
     if(preg_match($regex, $dir)) 
      return true; 
    } 
    return false; 
} 

今、私は例これらの種類で正規表現を遅らせることができることに注意してください物事がダウンし、dissalow配列内の任意の文字列との直接の一致がうまくいけば、$dirsの各$dirを各項目に対して$dissallowと照合してください。

+0

明らかに、私たちは、他の人がこのエリアにアクセスすることを許可しないアクセス制限を持っています。これは、ファイルやフォルダの不用意なアップデートを防ぐためです。私は単純なコメントアウトを提供するeXtplorerのメーカーによって設計されたセクションを使用しています。例: ".ht"(.htaccessのように)で始まるファイルを隠す:^ \。htをサンプルコードとして使用します。私はそれをさらに使い、共有したものを使って他のファイルを隠しました。これはうまくいきますが、ファイルを管理するための "イントラネット"ツールで編集したいと思う深いファイルを隠すことにもなります。 – Shane

+1

パターンのために文字列を再帰的にチェックしたいような音がします。 Regexesはそれをしませんが、私はあなたのために何かをする関数を書くことができます... – sg3s

+0

私はそれがあなたにはかなり簡単でない限り、これに深く進む必要があるかどうかはわかりません。私はおそらく、時間枠が許すプロジェクトよりも少し深く考えているでしょう。しかし、あなたが私に何かを送ってもらうと、私は休み時間に家で試してみることになり、何かを学ぶことになります;-) – Shane

1

PCREの場合、^と表示されます。の先頭に一致します。 |演算子を使用すると、「this OR that`と表示されます。

あなたの指定した正規表現では、期待しているものと一致しません。

/^(forbidden|restricted|xampp|apache\_pb)/i

、私は本当にあなたの質問を理解していない

+0

私のコードはうまくいきますが、それでもすべてのファイルとフォルダが隠されています。それは可能ではないかもしれないように見えますが、私の目標はこれに数を追加することでした(他の説明を参照) – Shane

関連する問題