gpt4 book ai didi

java - 清理/转义进入SSH命令的参数

转载 作者:行者123 更新时间:2023-12-02 13:59:09 30 4
gpt4 key购买 nike

我需要怎么做才能正确清理/转义程序化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参数可以来自用户上传的文件。从技术上讲,恶意用户可以上传带有无效文件名的文件。尽管我可以事先检查(我正在执行此操作),但我也想在这里进行检查。

最佳答案

我认为这里的一个好主意是确保将其作为单个参数传递给[,而不是多个参数(甚至多个命令)。因此,只需将其包装在'中,然后用'替换字符串中的所有'\''即可。

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

您也可以在命令的 '部分中使用 \"代替 echo,只要您不需要在服务器端进行变量扩展(并且这些字符串中没有变量)即可:
c.setCommand("[ -f " + escape(path) + " ] && " +
"echo 'File exists' || echo 'File does not exist'");

(请注意,我也做了一个小的语法修复。)

关于java - 清理/转义进入SSH命令的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7741576/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com