如何在Java中隔离不受信任的本地代码?

5
我有一份C库,我不太信任(可能会频繁崩溃)。我正在从Java进程中调用它。
为了防止C库崩溃导致整个Java应用程序崩溃,我想最好是为此库生成一个专用的Java进程,并让它通过套接字编程或RMI与Java应用程序进行接口。然后,如果发生崩溃,我可以只生成另一个进程并继续处理。 ProcessBuilder是否是正确的方法?还是有其他更简单的方法?
谢谢!
3个回答

3

是的,将本地代码托管在单独的Java进程中是保护您的应用程序免受本地代码攻击的唯一方法。

至于更简单的方法,只是实现上的差异。例如,不要从Java应用程序中派生代码,而是将本地代码包装在本地包装器中,并配置为自动启动。如果您了解C和套接字,则可以简化此解决方案。在这种方法中,RMI不是最佳选择。

即使您将本地代码包装在Java中,我仍然不会选择RMI。我曾遇到过Windows在WAN上出现网络问题。如果可能的话,我会保持通信简单。如果数据太复杂,可以使用基本序列化库。如果您选择XML路线,有几个选择。这有点过度,但您还可以嵌入http服务器和Web服务层。我不知道您的系统要求,但

恢复将带来各种挑战。如果它停止响应,您只需要生成另一个进程...您愿意这样做多少次...从Java进行进程管理还有很多需要改进的地方。


2

我不知道有更简单的方法。

对于父子进程之间的交互,我不会使用RMI或sockets - 我会使用子进程的标准输入和输出流,通过Process对象可访问。这很简单、高效且私密。您可以像操作socket数据流一样使用这些流,但没有任何认证、地址等身份验证方面的考虑。您可以自己编写协议,也可以使用类似Thrift或Protocol Buffers的工具从实体定义构建协议。


0
如果性能不是问题,而且存在其他应用程序可能会访问您的“本地”服务的可能性,我会选择RESTful或其他一些面向Web服务的方式。至于在崩溃时重新生成的问题,正如其他人所提到的那样,只需将进程生成为服务即可。
如果您的应用程序是将访问此本机服务的唯一实体,那么与纯套接字方式相比,我更喜欢使用RMI。在我看来,RMI非常适合进程间通信(其中进程是Java进程)。 RMI具有“可激活”远程对象的概念,这符合您的要求(在崩溃时自动生成)。此外,如果使用RMI,您的应用程序将通过定义明确的Java接口与本机进程通信,而不是通过特定协议进行通信(可以使用其他高级解决方案,例如Web服务,但在使用原始套接字时真正痛苦)。
顺便说一句,我们正在使用这种策略来运行我们的生产应用程序,效果非常不错,你的情况可能有所不同。 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接