【发布时间】:2009-06-10 16:22:40
【问题描述】:
我来自 C/C++ 背景,现在做了很多 C# 工作。
最近我开始对用 Java 做一些项目感兴趣,因为我在玩 Android SDK。
我知道 Java 应用程序在沙箱中运行,这会限制它们对系统的访问。
在桌面/服务器应用环境中,有哪些限制?
【问题讨论】:
标签: java security desktop-application sandbox restriction
我来自 C/C++ 背景,现在做了很多 C# 工作。
最近我开始对用 Java 做一些项目感兴趣,因为我在玩 Android SDK。
我知道 Java 应用程序在沙箱中运行,这会限制它们对系统的访问。
在桌面/服务器应用环境中,有哪些限制?
【问题讨论】:
标签: java security desktop-application sandbox restriction
Java 应用程序位于沙盒中,就像 .NET 应用程序位于沙盒中一样。它们都在各自的虚拟机上运行,并且对于它们的功能确实有一些限制,但在大多数情况下,它们对系统有很多访问权限,包括通过某些调用访问本机代码。
您可能正在考虑Java applets,它在浏览器中运行,通常位于安全沙箱中,可防止访问本地文件等系统资源。 (可以通过专门授予某些小程序访问系统的权限来规避此限制。)
这里有一个关于Security Restrictions 的部分,用于来自The Java Tutorials 的小程序,其中包括对小程序的限制列表。
【讨论】:
通常桌面和服务器应用程序在禁用安全性的情况下运行。但是,Java 和 JVM 仍然有一个健壮的类型系统,因此您不能例如强制转换为不是创建对象时使用的类型,不能访问已释放的内存,也不能在缓冲区末尾运行。
【讨论】:
对于普通的桌面和服务器应用程序,这些限制与沙盒概念无关(尽管您可以使用它对例如用户提交的代码应用非常细粒度的限制),而是与 Java 的平台无关性有关。基本上,操作系统特定的东西和硬件访问通常不能在纯 JAVA 中完成,除非 API 库特别处理。
例如:
【讨论】:
我认为您可能会看到的主要限制是在需要时轻松使用本机系统 API 的能力,例如,如果您需要使用 user32 或来自java的kernel32 API我认为这是可能的,但这并不是一件容易的事,但是在C#中它是相当容易的。
此外,如果您有一些旧版 C/C++ dll,您仍然可以在 C# 应用程序中使用它们,而在 java 中仍然很难做到,尤其是在最坏的情况下,当您的本机代码 api 必须使用指针时,您可以使用C# 应用程序中的不安全模式用于传递指针并在堆栈上分配固定内存...等。
但如上所述,Java 和 C# 通常具有相同的限制,特别是如果您的目标是独立于平台。
【讨论】: