Java Runtime.getRuntime().exec(字符串[])安全性

Java Runtime.getRuntime().exec(字符串[])安全性,java,runtime.exec,Java,Runtime.exec,我使用Runtime.getRuntime().exec(String[])运行进程,其中字符串数组的某些元素由用户定义 这安全吗?还是允许向终端注入代码 如果不安全,我可以做什么来避免代码注入?(它必须是独立于平台的)通常这是不安全的,因为它应该可以执行shell脚本(可能是恶意的) 我允许您知道一组预定义的命令,并让用户选择其中一个(带有可选参数,可能会以某种方式转义),而不允许完全输入命令。我认为这种情况下的安全性是由底层操作系统访问控制定义的。如果您正在使用unix并以受限用户身份运行脚

我使用Runtime.getRuntime().exec(String[])运行进程,其中字符串数组的某些元素由用户定义

这安全吗?还是允许向终端注入代码


如果不安全,我可以做什么来避免代码注入?(它必须是独立于平台的)

通常这是不安全的,因为它应该可以执行shell脚本(可能是恶意的)


我允许您知道一组预定义的命令,并让用户选择其中一个(带有可选参数,可能会以某种方式转义),而不允许完全输入命令。

我认为这种情况下的安全性是由底层操作系统访问控制定义的。如果您正在使用unix并以受限用户身份运行脚本,那么您应该不会有问题。因此,只要正确定义了访问控制,并且脚本以具有正确权限的用户身份运行,就可以了。(但是什么用例让您编写了这样的程序。)

假设您的用户提供参数,ProcessStarter就是您的朋友。关于如何使用它的小教程可以在

上找到,正如我在另一个答案的评论中提到的(不妨添加我自己的答案),只要你控制第一个参数,这应该是安全的。

所有这些评论似乎都缺少一个重要的事实。命令注入只是在exec中使用用户定义参数的危险之一。另一种可能的攻击是参数注入。您需要知道允许用户调用的命令的所有可能参数


一个危险命令的例子是find。用户可以添加选项-exec作为参数以获得任意命令执行

@Thomas谢谢你的回答。我已经在做类似的事情了。数组的第一个元素总是由我定义的,但我仍然不确定用户是否可以在任何操作系统中执行类似于[“MyProcess”、“expected parameter&rm-Rf*”]或其他命令的操作。@Jose-如果您控制第一个参数并使用String[]exec方法,那么您应该是安全的(假设你正在运行的程序没有对它得到的参数做任何不安全的事情)。好吧,你不能确定
任何
操作系统,但是你可以使用
expected parameter&rm-Rf*
->
“expected parameter&-Rf*”
(从shell的角度来看)这样的引号来转义参数也就是说,使用平台相关的转义表达式替换所有现有的引号,然后用其他引号包装参数。转义可能与平台相关,但如果您添加了对最常见平台的支持,则应该可以。另一个注意事项:如果您正在开发的是库或工具,则一定要记录这一点d提供实现者/用户可能设置的安全选项(可能取决于平台)。@Thomas-为什么你不能确定?java在调用exec时不执行shell。这就是为什么该方法的第一次用户会感到困惑的原因(因为它没有执行所有正常的shell魔术)。而且,如果您知道如何为给定平台报价,您可能知道exec将如何在该平台上工作。谢谢您的回答。我正在使用unix测试项目,但当我的部分完成时,它将不在我的手中,因此可以在windows或其他操作系统中部署。我无法控制是否使用正确的权限正确部署它ions,这就是我害怕的。如果我能从代码中控制代码注入,我会更放心。谢谢你的回答。这很有趣,我将不得不更深入地研究它。我已经在不同线程中执行命令,但这个解决方案值得研究。谢谢你的回答。这是你的装备只要第一个参数是受控的,它应该是安全的。我需要进一步调查。