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

  显示原文与译文双语对照的内容

要正确清理/转义正在进入程序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;
}

不安全的原因是,路径参数可以来自用户上传的文件。 恶意用户在技术上可以上传一个无效文件名的文件。 虽然我可以预先检查这个( 我正在做),我也想在这里检查它。

时间: 原作者:

我认为这里的一个好主意是确保它作为一个参数传递给 [,而不是多个( 甚至多个命令) 。 所以简单地将它包装在 ' 中,并用 ''' 替换字符串内的任何 '


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

只要在服务器端( 这些字符串中没有变量) 上不需要变量扩展,也可以使用 ' 代替 "echo 部分:


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

( 注意,我还做了一个小的语法

原作者:
...