2011-10-12 69 views
1

我需要做些什么才能正确清理/转义正在输入到编程SSH命令中的参数?进入SSH命令的Sanitize/escape参数

例如,路径参数 -

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; 
} 

其原因是不安全是该路径参数可以来自用户的上传。恶意用户可能会在技术上上载带有无效文件名的文件。虽然我可以事先检查(我正在做这个),但我也想在这里检查一下。

+0

取决于你的意思是“无效”的东西,我想。 –

+0

恶意。确保它本身没有执行“SSH注入”... –

+0

只是反斜杠不是“正常”的所有内容,所以它肯定是一个文件名,我猜?特别是分号,当然。 –

回答

1

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

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

您还可以使用'代替\"该命令的echo一部分,只要你不需要在服务器端变量扩展(也有在这些字符串没有变量):

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

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

+0

我喜欢这里要去的地方......非常感谢答案。它返回的文件不存在,但。我会继续修补它,看看我能否得到它的工作 –

+0

此外,为什么使用'''''而不是只用'\''来转义? –

+0

我从[这个Unix&Linux问题](http://unix.stackexchange.com/q/4770/5779)得到了这个引用机制,它很好地解释了它。 * Bourne-like贝壳的单引号实际上是字面的(这意味着你不能用它来引用单引号字符本身)。* –