有人可以帮助我了解以下攻击是什么以及java如何使这些攻击无法进行:
- 超越常规堆栈 - 蠕虫和病毒的常见攻击
- 在自己的进程空间之外破坏内存
- 未经许可读取或写入文件。
醇>
我精通c / c ++并从java开始,所以请帮助我理解这些。
答案 0 :(得分:5)
Java是一种相当安全的语言,因为有几个原因,主要集中在你的3点上,Java比其他语言更安全,主要是因为它在自己的虚拟机中执行字节码指令,而不是本机代码。它不允许超出范围的数组访问,并且没有指针访问权限。这几乎可以回答你的前两点。 至于未经许可的阅读和写作,我不确定你的意思。固有的文件读写是在操作系统级别进行控制的。如果没有一些利用来获得比它应该获得的更多许可,无论它写入什么语言,程序都无法写入或读取操作系统禁止的文件。如果您的意思是未经应用程序的许可,从插件系统开始,那么您需要考虑添加安全管理器或自己的审查,以防止插件或模块在您的应用程序进程下更改文件。
答案 1 :(得分:5)
首先,安全问题更多的是问题 实施,而不是语言。 Java确实强加了一些 安全检查(边界检查等)是可选的(和 在C ++中,在运行时非常昂贵)。关于你的 具体问题:
我认为这是指经典的缓冲区溢出问题,
这通常是C中的问题。在C ++中,我们使用std::vector
,
哪个可以(通常是,至少在正确的编译器时)
给出了选项)与Java进行相同的检查。如果,另一方面
它确实是指堆栈溢出(例如也是由于堆栈溢出)
深度递归),那么因为JVM的堆栈不是
机器堆栈,Java可以做额外的检查,也保证了
堆栈溢出时内存不足异常。 (这是
在C ++中也是可能的,但我不知道编译器是做什么的
它。操作系统并不总是那么容易。)
这是操作系统问题,而不是语言问题。现代操作系统 不允许程序访问自己以外的内存 进程空间,所以Java和C ++都不允许它。
如上所述,这是操作系统问题,而不是语言问题 现代操作系统相对较好地执行它,无论是否 该程序是用Java或C ++编写的。
总之,无论如何,2和3都是不可能的 语言和1将不会出现在写得很好的C ++中(虽然它是 C)过去的问题。
答案 2 :(得分:4)
安全是一个相对的事情。当Java在虚拟机中运行时,它可以自我保护,以解决在C中看到的一些经典问题。
超越例程堆栈 - 蠕虫和病毒的常见攻击
Java有一个定义的抛出StackOverflowError的行为,你无法绕过它。
在自己的进程空间之外破坏内存
恕我直言,这确实是操作系统的考虑因素。您的操作系统可以保护您的进程免于修改其他进程的内存,即使在C语言中也是如此。无论操作系统是否提供此功能,Java都会保护您不会访问任意内存位置。大多数现代操作系统都提供这种保护。
未经许可读取或写入文件。
再次,您的操作系统可以保护您免于在C中执行此操作,并且应该是您的第一道防线。 Java所做的是允许您运行不受信任的代码并保护您的文件,即使您可以访问它们,但停止其中一个程序访问它们。 Java有两种机制,SecurityManager和AccessControl。