9

Java 供应商和社区表示“Java 比其他语言更安全”。但我想知道怎么做?

如果我们看一下 Java 和 .Net 中的编程,它们看起来很相似。

.net编程涉及的步骤 点击了解更多

  1. 编写.net 程序。
  2. 将您的代码编译为 MSIL(编译将您的源代码翻译为 Microsoft 中间语言 (MSIL) 并生成所需的元数据)。
  3. 将 MSIL 编译为本机代码(在执行时,即时 (JIT) 编译器将 MSIL 翻译为本机代码。在此编译期间,代码必须通过检查 MSIL 和元数据的验证过程,以确定代码是否可以被确定为类型安全的)。
  4. 运行代码(公共语言运行时提供使执行能够发生的基础结构和可以在执行期间使用的服务)。

java编程涉及的步骤 点击了解更多

  1. 编写一个Java程序
  2. 编译 Java 程序(Java 编译器将 java 源代码转换为 .class 文件,它是一个字节码)
  3. JVM将程序加载到内存中(JVM将.class文件加载到内存中进行字节码验证并将.clsss文件转换为机器语言)
  4. Java 程序的执行(无论我们在 Java 程序中编写了什么操作,JVM 通过解释字节码来执行它们。如果我们谈论旧的 JVM,它们速度很慢,一次执行并解释一个字节码。现代 JVM 使用 JIT 编译单元,我们将甚至调用即时编译)。

如果我们查看两种语言的步骤,它们几乎相同,那么“为什么 Java 与其他语言相比更安全?”

4

3 回答 3

11

Java 是一种安全语言的原因有很多,而且它肯定比某些语言更安全,但我认为说它比所有其他语言更安全还有些牵强。

Java 具有多种安全特性:

  1. 引用的自动空检查、数组的边界检查、强制转换验证等,以防止程序出现类型错误。将此与 C 或 C++ 进行比较,这些相同的错误(有一些例外)会导致未定义的行为。

  2. 在执行之前验证字节码。这使得程序无法跳转到未定义的指令,或尝试对不存在的对象执行操作,或在指令级别产生类型错误等。将其与 C 或汇编相比,程序可以跳转到错误的指令,或尝试读取函数不存在的参数(想想va_args)等)

  3. 加载新代码时的运行时安全检查。通过调解对系统资源的访问并防止程序在运行时加载或生成任意代码,Java 运行时的使用SecurityManagerClassLoader使 Java 运行时易于防止任意代码在计算机上执行。将此与 C 或 C++ 进行比较,后者可以读取和写入任意值、发出任意系统调用、生成和执行任意代码等。

  4. 某些功能的库级安全性。例如String是不可变的 和final,因此接收 a 的函数String可以验证字符串,而不必担心另一个线程会更改其值。

这不是 Java 安全特性的完整列表,但它应该让您了解 Java 中其他语言中不存在的一些设计注意事项。

希望这可以帮助!

于 2013-01-14T04:15:38.537 回答
3

你提到你在哪里读过一些,但你能重新读一下吗,因为我猜作者在写它的时候会把 JAVA 与 C++/Fortran/C 等进行比较。

您还可以在http://www.veracode.com/blog/2010/06/which-tastes-better-for-security-java-or-net/中阅读有关安全性可测试性的旧帖子

你可以看到两者几乎相同......

于 2013-01-08T07:13:48.393 回答
2

Java 或 .Net 程序,与 C 和类似程序相比,不受一些简单类型的安全漏洞的影响——缓冲区溢出或格式字符串错误。

虽然这摆脱了一些可以获取远程代码执行的方式,但 Java 并没有采取任何措施来防止,例如,任何 Web 应用程序漏洞。它也无助于逻辑错误。

于 2013-01-09T01:31:56.993 回答