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