我应该在Java Web应用程序中使用Security Manager吗?

是否足以使用运行应用程序服务器进程的用户的权限来保护Java Web应用程序,或者将SecurityManager与合适的策略文件一起使用是否合理?

我曾经做过前者,而不是后者,但有些客户希望我们也使用SecurityManager,它会明确地为每个第三方组件授予权限,以确保没有任何恶意代码潜伏在那里。

我已经看到一些Servlet容器,比如Resin ,建议不要使用SecurityManager来减慢速度。 有什么想法吗?

虽然我讨厌建议使用安全function,但我认为SecurityManager更倾向于管理在JVM中执行不受信任或第三方代码的情况。 思考applet或托管的共享应用服务器场景。 如果您完全控制应用服务器并且没有运行任何其他人的代码,我认为这是多余的。 根据我的经验,启用SecurityManager确实会对性能产生重大影响。

你的问题没有简单的是/否答案,因为它真的取决于:你想要保护什么,以及你希望从中获得什么?

例如,我使用SecurityManager实现IP过滤,只允许列入白名单的IP地址连接到我的应用程序。 如果您只是想禁止访问磁盘文件,那么以较低权限的用户运行应用程序可能是更好的解决方案。

如果您根本不信任第三方插件,请记住,一旦您允许执行插件代码,即使您使用SecurityManager,该插件也可能会使您的应用程序崩溃。 如果您的应用程序加载了插件,可能是白名单插件并在加载插件之前检查列表是更好的解决方案。

如果您决定使用它,您将受到性能影响(因为JVM将执行更多检查),但它的运行速度实际上取决于您将执行检查的代码/配置。 我的IP白名单非常快,因为它只包含单个列表查找; 如果您的检查包括调用远程Web服务和访问数据库,您可以减慢很多事情,但另一方面,如果您有足够的硬件和很少的并发用户(换句话说,如果您能负担得起),即使这样也无关紧要。

在java中正确配置安全管理器可能很难。 例如,如果您不限制安全管理器本身,则只需将安全管理器设置为null即可绕过所有安全性。

使用安全管理器只有在你的JVM运行不受信任的代码时才有意义,否则设置起来很麻烦,因为你必须事先知道应该为每个function设置什么权限(例如:RMI,套接字,I / O) )并为每个客户。