2

プログラムによる SSH コマンドに入力されているパラメーターを適切にサニタイズ/エスケープするには、どうすればよいですか?

たとえば、パス パラメータ -

public boolean exists(String path) {

    try {
        ChannelExec c = (ChannelExec) session.openChannel("exec");

        //Here *** would like to be sure that the path is completely valid
        c.setCommand("[ -f " + path + " ] && echo \"File exists\" || echo \"File does not exists\"");

        InputStream in = c.getInputStream();

        c.connect();

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        IOUtils.copy(in, out);

        in.close();
        out.close();

        System.out.println(out.toString("UTF-8"));
        c.disconnect();

    } catch (JSchException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // TODO Auto-generated method stub
    return false;
}

これが安全ではない理由は、path パラメーターがユーザーがアップロードしたファイルから取得される可能性があるためです。悪意のあるユーザーは技術的に、無効なファイル名のファイルをアップロードする可能性があります。これは事前に確認できますが(現在行っています)、ここでも確認したいと思います。

4

1 に答える 1

2

[ここでは、複数のパラメーター(または複数のコマンド) ではなく、単一のパラメーターとして渡されることを確認することをお勧めします。したがって、単純に でラップし、文字列内'を で置き換えます。''\''

private String escape(String s) {
    return "'" + s.replace("'", "'\\''") + "'";
}

サーバー側で変数展開が必要ない限り (そしてこれらの文字列に変数がない場合)、コマンドの一部の'代わりに使用することもできます。\"echo

c.setCommand("[ -f " + escape(path) + " ] && " +
              "echo 'File exists' || echo 'File does not exist'");

(私は小さな文法修正も行ったことに注意してください。)

于 2011-10-12T15:04:07.703 に答える