Java 如何作为web服务安全地执行shell命令

Java 如何作为web服务安全地执行shell命令,java,security,shell,rest,Java,Security,Shell,Rest,所以我面临着安全困境 基本上,我所做的是为“定理证明者的数千个问题”应用程序提供基于web的翻译服务。我拿了一份用英语写的文件,并把它翻译成英文 为了演示这种转换,我想提供两个RESTful web服务。一个用于翻译PSOA规则ML,另一个用于提供推理() 第一个服务使用Java/ANTLR3/RestEasy,第二个服务使用Java/ApacheCommonsExec根据定理证明程序测试从第一个服务返回的生成TPTP字符串 Apache Commons Exec是否提供足够的安全性来执行此操作

所以我面临着安全困境

基本上,我所做的是为“定理证明者的数千个问题”应用程序提供基于web的翻译服务。我拿了一份用英语写的文件,并把它翻译成英文

为了演示这种转换,我想提供两个RESTful web服务。一个用于翻译PSOA规则ML,另一个用于提供推理()

第一个服务使用Java/ANTLR3/RestEasy,第二个服务使用Java/ApacheCommonsExec根据定理证明程序测试从第一个服务返回的生成TPTP字符串


Apache Commons Exec是否提供足够的安全性来执行此操作?我意识到还有其他明显的解决方案,例如组合服务,以确保只测试TPTP FOF语句。但如果可能的话,我想将这个定理证明器本身作为一个web服务公开。提前谢谢

我使用过ApacheCommonsExec,但没有用于web应用程序。它“足够安全”满足我的需要

最安全的选择是永远不要将任何字符串参数直接从web传递到exec进程。如果您可以使用最终常量或枚举,您的安全性将大大提高

除此之外,您需要仔细清理并转义任何正在传递的命令文本。在不知道您所使用的确切系统(Windows/Linux/etc)的情况下,这将根据平台进行更改。我的建议是找一家为你做这件事的图书馆


最后,在启用java安全管理器的情况下运行。这可能会破坏ApacheCommonsExec,但您应该能够解决这些问题。

不是完整的答案,而是一些想法。这主要归结为验证用户输入的每一项。我建议您只接受简单的输入,比如一个整数(可以很容易地进行验证和边界检查或映射到枚举),它标识了您想要执行的一些函数(有点像存储过程)。另一个要考虑的问题是当事情出错时如何停止或杀死shell脚本(思考超时)。您还需要考虑哪些用户帐户拥有并运行您的shell脚本。大多数情况下,您只需验证用户输入,不要相信任何东西。

确保web应用程序容器(Tomcat)没有以root用户身份运行。如果可能,您也可以在chroot环境中运行它

如果必须将文本传递给正在执行的命令,请尝试将文本写入文件,并使该程序从文件中读取文本,而不是尝试将其作为参数传递

安全性是关于层的。没有一件事可以让某些东西变得“安全”,但如果你添加了足够多的层,那么它就会变得足够安全


另外,请尝试询问您的问题,以获得更专业的意见。

不要听取互联网上任何人(包括我自己)的安全建议。谢谢@dasblinkenlight,我会记住这一点。然而,我仍然很好奇人们在这里应该提供什么样的解决方案。请把这个问题缩小一点,它太宽泛了,不适合SO的问答形式。