0

コード'if(-e "filename")'は、そのコードを含むスクリプトが実行されるディレクトリに、filenameという名前のファイルが存在するかどうかをテストします。

名前チェックは何をしていますか?Perl?OS?POSIX-osをBashしますか?

'if(-e "cat string")'はLinuxでcatコマンドを実行しますか?


「../file」が親ディレクトリ内のファイルにアクセスするような不要なファイルアクセスを回避できるようにするために知りたいのですが。


チェックコードを共有するには:

if($folder =~ m/$([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)^|$([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)\/|\/([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)\/|\/([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)^|\$'[^']*'/)
{
    #error
}


更新された正規表現:

if($folder =~ m/(\/|\\)|$([\\]?\.[\\]?\.^|$[\\]?(\*|\?)^|\$'[^']*'/)
{
    #error
}

説明:$folderはすでに純粋なファイル名である必要があります。WindowsまたはPOSIXパスセパレーターが含まれている場合、または(エスケープされた)親ディレクトリのバックリンクである場合、または(エスケープされた)ワイルドカードである場合(最初に一致するファイルと一致し、少なくともMac OS Xでtrueを返すため)、またはCANSIエスケープが含まれている場合どこでもシーケンス、エラーを通知します。それ以外のものは、合法でない場合や日陰の場合でも、単に「ファイルが存在しません」を返す必要があるため、「if(-e $ folder)」に指定できます。

4

3 に答える 3

7

オペレーティングシステムはそうします。Perlの-e(およびのような他の-s)呼び出しは、Cライブラリ関数を呼び出すことによって実装されますstat

シェルが含ま"cat some_file"れていないため、実行されません。代わりに、OSは「catsome_file」というファイルを探します。

statもちろん、相対パス名で呼び出すこともできます。それが望ましくない場合は、ファイル名と拡張子以外のすべてを削除します。この種のもののためのPerlモジュールがあります。

提案された正規表現は、正直なところ、完全に読み取り不能で保守不可能であるため、デバッグ/調査したくありません。

于 2012-10-19T12:15:52.087 に答える
1
  1. 名前は誰がチェックしますか? 最終的に、デバイスドライバーでない限り、すべてのファイルI/Oはオペレーティングシステムによって実行されます。Perlはオペレーティングシステムにそのチェックを行うように要求しますが、Cランタイムライブラリを経由してチェックする場合があります。なぜ質問するのですか?

  2. 'if(-e "cat string")'はLinuxでcatコマンドを実行しますか?いいえ。構文が間違っています。ファイルを開いて、自分で読んでください。OK、catを使用する必要がある場合は、出力で何をしたいかに応じて、、systemまたはを使用します。xq

  3. 「../file」のような不要なファイルアクセスを回避できるようにするために知りたいですか?なぜそれは望ましくないのですか?それは..、または先頭のディレクトリ名ですか?

    use File::Basename;
    my $name = basename($filename);
    

先頭のディレクトリ名を削除します。

于 2012-10-19T12:16:22.303 に答える
0

Perlは、ファイルの存在を確認するためにシェルを使用しません。-e奇妙な外観にもかかわらず、内部のPerl関数として扱うことができます。シェルコマンドを実行するための卑劣な方法として使用することはできません。

このような複雑な正規表現は必要ないと思います。ユーザーが親ディレクトリに入れないようにする場合は、ファイル名が単語文字で始まることを確認してください(Linuxではとにかく)。

if($folder =~ m/^\W/)
{
    print "path doesn't start with an alphanumeric character!";
}

もちろん、この方法でパスを適用することは、それが懸念事項である場合、不十分なセキュリティ方法です。代わりに、権限を適切に設定する必要があります。

于 2012-10-19T12:17:57.717 に答える