我正在使用Runtime.getRuntime().exec(String[])来运行一些由用户定义的String数组元素的进程。
这个安全吗?或者它会允许向终端注入代码吗?
如果不安全,我该怎么避免代码注入呢?(必须是平台无关的)
我正在使用Runtime.getRuntime().exec(String[])来运行一些由用户定义的String数组元素的进程。
这个安全吗?或者它会允许向终端注入代码吗?
如果不安全,我该怎么避免代码注入呢?(必须是平台无关的)
正如我在另一个答案的评论中提到的(也许可以添加我的答案),只要您控制第一个参数,这就应该是安全的。
一般来说,这不安全,因为可以执行可能是恶意的shell脚本。
我建议允许预定义的命令集合,并让用户从中选择一个(带有可选参数,这些参数可能已被转义),而不是完全允许输入命令。
任何
操作系统,但你可以尝试使用引号来转义参数,例如 expected parameter & rm -Rf *
-> "expected parameter & -RF *"
(从shell的角度看)。也就是说,使用平台相关的转义表达式替换所有现有的引号,然后再用额外的引号包装参数。转义可能与平台有关,但如果你为最常见的平台添加支持,应该就没问题了。 - ThomasSecurityManager#checkExec()
来只允许一组特定的命令被执行。 - Thomas我认为在这种情况下,安全性是由底层操作系统访问控制定义的。如果您正在使用unix并将脚本作为受限用户运行,则应该没有问题。只要访问控制被正确定义并且脚本以具有正确权限的用户身份运行,那么就没问题了。(但是是什么用例促使您编写这样的程序呢。)
find命令是一个危险的例子。用户可以添加选项-exec作为参数来获得任意命令执行能力。