1

いくつかのことを避けるために、ユーザーが入力したシェルスクリプトへの完全なUnixパスを検証する簡単なC#関数を作成しようとしています。

  • パスは正しい形式であり、スペースやセミコロンなどの無効な記号はありません
  • 疑わしいコマンドはありません。rm -rf /
  • パスはフルパスを表し、親戚はありません
  • スクリプトが実際に存在するかどうかは関係ありません

関数は次のような形式になります。

public bool IsUnixPathValid(string path)
{
    return !path.IsEmptyOrNull() 
        && path.StartsWith("/") 
        && !path.ContainsCharacters(";', \"")
}

質問:このようなことを実行する既存のライブラリはありますか?そうでない場合は、最善のアプローチは何であり、どのような詳細に注意する必要がありますか(安全だと考えてください)。

4

1 に答える 1

5

指定されたパスにファイルが実際に存在するかどうかを確認しようとしない場合は、おそらくパスがで始まること/(絶対パスのみが必要なため)と埋め込みパスがないことを確認するだけです。 NUL(0)バイト(POSIXパスにそれらを含めることができないため)。それでおしまい。絶対に他のものはすべて有効なパスになる可能性があります。特に、パスにはスペースとセミコロンを使用できます。

隣接する複数のスラッシュは冗長であるため、チェックすることもできると思います...ただし、それらは引き続き受け入れられるため(複数のスラッシュの各グループは、単一のスラッシュと同じ意味を持ちます)、実際には無効ではありません。

パスに埋め込まれている「rm-rf/」のような疑わしい文字列をチェックすることは悪い考えです。引用符で囲まれていないパスがシステムコマンドに直接送信されることによってセキュリティの問題が発生する場合は、ブラックリストに登録するのではなく、セキュリティの問題を解決する必要があります(パスを適切に引用符で囲むか、パスを解析するシェルなどに渡さない方がよい)。いくつかの選択された埋め込み文字列。ブラックリストに登録すると、ブラックリストに登録されているはずの何かを見逃す可能性が高くなります。さらに、実際に有効な良性のパスであるものを拒否する可能性があります。

于 2012-12-13T22:04:13.843 に答える