2012-02-20 10 views
0

私はトラバーサルのためのパスをチェックする最良の方法を探しています。現在のパスは、二つの部分である$のuser_rootと以下のように$ input_path:RegExでパスとファイル名が安全であることを確認しますか?

$user_root = '/var/www/users_root'; 
$input_path = '../../../'; 
$full_path = $user_root + $input_path; 

それが正規表現に来るとき、私は無用です。私はトラバーサル(可能であれば削除する)をチェックし、正しい文字がパスの中にあることを確認したいと思います&ファイル名はunixとwindowsです。

ありがとう

+0

@DC_はほとんどstr_replaceで再生しましたが、正規表現がより良い選択肢であることが分かります。 – arbme

答えて

1

$ input_path内で "../"をチェックするだけではどうですか?また、「正しい文字」は何と考えていますか?私はA-Z、a-z、0-9がすべて問題ないと仮定しています。ハイフン、アンダースコア、スペースはどうですか?ほとんどの句読点は、unixとlinuxのファイル(およびディレクトリ)名で有効ですが、使用しているオペレーティングシステムを指定していません。

if (strpos($input_path, "../") > 0) { 
    die("Obvious attempt to look behind the curtain"); 
} else 
if (preg_match("/[^A-Za-z0-9_./-]/", $input_path) { 
    die("Illegal characters"); 
} else { 
    // do something useful 
} 

味を塩にする。

正規表現内の角括弧内のハイフンは、開き角かっこのすぐ横にある必要があります。また、エスケープする必要があります。したがって、正規表現では、[a-z0-9_-]は、英数字プラス下線とハイフンを意味します。しかし、[a-z0-9-_]はエラーです。

+0

私はUNIXとWindowsのディレクトリとファイルに許可される文字を意味します。上記は正しいでしょうか? – arbme

+0

[この回答をServerFaultで確認する](http://serverfault.com/questions/150740/linux-windows-unix-file-names-which-characters-are-allow-which-are-unesc)を参照してください。安全であるように、あなたが知っている以外のものは許可しないでください。 '[^ a-zA-Z0-9 ._-]'のように。スラッシュを許可しないと、 "../"は決して上がらないでしょう。 – Graham

関連する問題