我使用调用Runtime.getRuntime()。EXEC(字符串[])来运行,其中一些字符串数组的元素的由用户定义的过程。调用Runtime.getRuntime()。EXEC(字符串[])安全
这是安全吗?或者它会允许注入代码到终端?
如果不安全我该怎么做才能避免代码注入? (它必须是独立平台)
我使用调用Runtime.getRuntime()。EXEC(字符串[])来运行,其中一些字符串数组的元素的由用户定义的过程。调用Runtime.getRuntime()。EXEC(字符串[])安全
这是安全吗?或者它会允许注入代码到终端?
如果不安全我该怎么做才能避免代码注入? (它必须是独立平台)
正如我在另一个答案的评论(也可以添加我自己的答案)中提到的,只要你控制第一个参数,这应该是安全的。
一般来说,这是不是安全的,因为它应该可以执行shell脚本(这可能是恶意的)。
我会允许一组预定义,你知道,并让用户选择其中的一个(有可能以某种方式逃脱可选参数),而不是使之完全进入命令的命令。
@Thomas谢谢你的回答。我已经在做那样的事情了。数组的第一个元素总是由我定义,但我仍然不确定用户是否可以在任何操作系统中执行类似[“MyProcess”,“expected parameter&rm -Rf *”]或其他命令的操作。 – 2011-03-14 16:44:32
@Jose - 如果你控制第一个参数并使用String [] exec方法,那么你应该是安全的(假设你正在运行的程序不会对它获取的参数做任何不安全的事情)。 – jtahlborn 2011-03-14 16:52:33
那么,你不能确定任何操作系统,但是你可以使用'expected parameter&rm -Rf *' - >''expected parameter&-RF *'''引用来引用参数。从shell的角度来看),即使用平台相关的转义表达式替换所有现有的引号,然后用额外的引号包装参数。转义可能取决于平台,但如果您添加对最常见平台的支持,则应该没问题。 – Thomas 2011-03-14 17:00:53
我认为这种情况下的安全性是由底层操作系统访问控制定义的。如果您使用的是unix并以有限的用户身份运行脚本,那么您应该没问题。所以只要正确定义了访问控制并且脚本以具有正确权限的用户身份运行,那就没有问题。 (但有什么用例让你写这样的程序。)
感谢您的回答。我使用unix来测试项目,但是当我的部分完成时,它将不在我的手中,因此它可以部署在Windows或其他操作系统中。我无法控制它是否会以正确的权限正确部署,这就是我所害怕的。如果我可以从代码中控制代码注入,我会更放心。 – 2011-03-14 16:51:47
假设你的用户提供参数,为ProcessStarter是你的朋友。如何使用它的小教程可以在http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder.html
感谢您的回答。这很有趣,我将不得不深入研究一下。我已经在不同的线程中执行这些命令,但那些值得研究的解决方案接缝。谢谢 – 2011-03-14 16:58:53
所有这些评论似乎都缺少一个重要的事实。命令注入只是使用exec自定义参数的危险之一。另一种可能的攻击是参数注入。您需要了解您让用户致电的命令的所有可能参数。
找到一个危险命令的例子。用户可以添加选项-exec作为参数以获得任意的命令执行。
感谢您的答案。它认为你的观点是正确的,只要第一个参数得到控制,它应该是安全的。我需要进一步调查。 – 2011-03-14 18:18:54