将java解释为安全语言?

时间:2012-12-12 09:25:49

标签: java c++ metaprogramming

有人可以帮助我了解以下攻击是什么以及java如何使这些攻击无法进行:

  
      
  1. 超越常规堆栈 - 蠕虫和病毒的常见攻击
  2.   
  3. 在自己的进程空间之外破坏内存
  4.   
  5. 未经许可读取或写入文件。
  6.   

我精通c / c ++并从java开始,所以请帮助我理解这些。

3 个答案:

答案 0 :(得分:5)

Java是一种相当安全的语言,因为有几个原因,主要集中在你的3点上,Java比其他语言更安全,主要是因为它在自己的虚拟机中执行字节码指令,而不是本机代码。它不允许超出范围的数组访问,并且没有指针访问权限。这几乎可以回答你的前两点。 至于未经许可的阅读和写作,我不确定你的意思。固有的文件读写是在操作系统级别进行控制的。如果没有一些利用来获得比它应该获得的更多许可,无论它写入什么语言,程序都无法写入或读取操作系统禁止的文件。如果您的意思是未经应用程序的许可,从插件系统开始,那么您需要考虑添加安全管理器或自己的审查,以防止插件或模块在您的应用程序进程下更改文件。

答案 1 :(得分:5)

首先,安全问题更多的是问题 实施,而不是语言。 Java确实强加了一些 安全检查(边界检查等)是可选的(和 在C ++中,在运行时非常昂贵)。关于你的 具体问题:

  1. 我认为这是指经典的缓冲区溢出问题, 这通常是C中的问题。在C ++中,我们使用std::vector, 哪个可以(通常是,至少在正确的编译器时) 给出了选项)与Java进行相同的检查。如果,另一方面 它确实是指堆栈溢出(例如也是由于堆栈溢出) 深度递归),那么因为JVM的堆栈不是 机器堆栈,Java可以做额外的检查,也保证了 堆栈溢出时内存不足异常。 (这是 在C ++中也是可能的,但我不知道编译器是做什么的 它。操作系统并不总是那么容易。)

  2. 这是操作系统问题,而不是语言问题。现代操作系统 不允许程序访问自己以外的内存 进程空间,所以Java和C ++都不允许它。

  3. 如上所述,这是操作系统问题,而不是语言问题 现代操作系统相对较好地执行它,无论是否 该程序是用Java或C ++编写的。

  4. 总之,无论如何,2和3都是不可能的 语言和1将不会出现在写得很好的C ++中(虽然它是 C)过去的问题。

答案 2 :(得分:4)

安全是一个相对的事情。当Java在虚拟机中运行时,它可以自我保护,以解决在C中看到的一些经典问题。

  

超越例程堆栈 - 蠕虫和病毒的常见攻击

Java有一个定义的抛出StackOverflowError的行为,你无法绕过它。

  

在自己的进程空间之外破坏内存

恕我直言,这确实是操作系统的考虑因素。您的操作系统可以保护您的进程免于修改其他进程的内存,即使在C语言中也是如此。无论操作系统是否提供此功能,Java都会保护您不会访问任意内存位置。大多数现代操作系统都提供这种保护。

  

未经许可读取或写入文件。

再次,您的操作系统可以保护您免于在C中执行此操作,并且应该是您的第一道防线。 Java所做的是允许您运行不受信任的代码并保护您的文件,即使您可以访问它们,但停止其中一个程序访问它们。 Java有两种机制,SecurityManager和AccessControl。