我正在使用Runtime.getRuntime()。exec(String [])来运行其中某些String数组元素由用户定义的进程。
这样安全吗?或者它是否允许将代码注入终端?
如果不安全我该怎么做以避免代码注入? (它必须是独立于平台的)
答案 0 :(得分:3)
正如我在另一个答案的评论中所提到的(不妨添加我自己的答案),只要你控制第一个参数,这应该是安全的。
答案 1 :(得分:2)
通常这不安全,因为它应该可以执行shell脚本(可能是恶意的)。
我允许您知道一组预定义的命令,并让用户选择其中一个(可选参数可能以某种方式转义),而不是允许完全输入命令。
答案 2 :(得分:2)
假设您的用户提供参数,ProcessStarter就是您的朋友。有关如何使用它的小教程可以在https://www.java-tips.org/java-se-tips-100019/88888889-java-util/426-from-runtimeexec-to-processbuilder.html
找到答案 3 :(得分:1)
我认为这种情况下的安全性是由底层操作系统访问控制定义的。如果您使用unix并以受限用户身份运行脚本,那么您应该没问题。因此,只要正确定义了访问控制并且脚本以具有正确权限的用户身份运行,那么就可以了。 (但是什么用例使你编写了这样的程序。)
答案 4 :(得分:1)
所有这些评论似乎都缺少一个重要的事实。命令注入只是使用exec的用户定义参数的危险之一。另一种可能的攻击是参数注入。您需要知道您允许用户调用的命令的所有可能参数。
找到危险命令的一个例子。用户可以添加选项-exec作为参数以获得任意命令执行。