どちらの方法でも動作しますが、ホワイトリストはブラックリストの代わりに安全です(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
と照合してください。
(例えばディレクトリリストのような)行の先頭に一致します。しかし、 '|'は優先順位が非常に低いので、 '^ a | b'は' 'a''または' b''を意味し、* ''^a'や '^ b'"を意味しません。つまり、文字列の先頭にないときでも 'b'と一致します。おそらく ''禁止されています^^制限されています^ xampp |^apache_pb' 'です。 – ruakh
この場合、 '^'は文字クラスの否定ではなく、文字列の先頭をマークすると考えています –
正規表現には複数文字の否定がありません。あなたは否定的な先読みを使ってあなたが望むものを得ることができるかもしれません。 – ThiefMaster