+-
java – apache commons CommandLine对象是否可以防止命令行注入?
我想使用org.apache.commons.exec Java库来调用可执行文件. CommandLine对象是否可以防止命令行注入?例如,如果我打电话:

String singleStringArgument = "-whatever;rm -rf ~/*"; // evil looking argument!
CommandLine cl = new CommandLine(new File(pathToExe,exeName)); 

cl.addArgument(singleStringArgument);  // oh no!

Executor exe = new DefaultExecutor();
exe.execute(cl);

除了预期的命令之外还会运行rm -rf~ / *吗?如果是这样,防止这种情况的最佳方法是什么?

API说addArgument()“处理引用”,但我不确定这意味着什么.我可以用一个测试用例来看看我的linux盒子上发生了什么,但我想确保它在其他平台上也是安全的.

最佳答案
;是shell的一个特性.如果你没有在sh -c或类似的东西周围创建一个命令行,你就无法注入.并不是公共资源是安全的,而是你甚至没有运行具有可视性的程序.

Commons CLI正在包装Process类.未记录Process类以启动shell.记录下来,用你告诉它的指定参数做一个exec.

根据评论,开源的一个奇迹是你可以阅读源代码.如果commons-CLI的版本X执行您喜欢的操作,请依赖它,并且不进行重新检查就不升级.

点击查看更多相关文章

转载注明原文:java – apache commons CommandLine对象是否可以防止命令行注入? - 乐贴网