解释Java作为一种安全语言?
explanation to java as a secure language?
有人可以帮助我了解以下攻击是什么以及Java如何使这些攻击变得不可能:
- 超越例行堆栈 - 蠕虫和病毒的常见攻击
- 损坏其自身进程空间之外的内存
- 未经许可读取或写入文件。
我精通c/c ++并从java开始,所以请帮助我理解这些。
首先,安全问题更多的是 实现,而不是语言。 Java确实强加了一些 可选(和 运行时非常昂贵)在C++。 关于您的 具体问题:
-
我认为这是指经典的缓冲区溢出问题, 这在 C 中通常是一个问题。 在C++中,我们使用
std::vector
, 可以(并且通常这样做,至少当正确的编译器时 选项给出)执行与 Java 相同的检查。 如果,另一方面 手,它确实指的是堆栈溢出(例如,由于 深度递归),那么因为 JVM 的堆栈不是 机器堆栈,Java可以做额外的检查,还可以保证 堆栈溢出时的内存不足异常。 (这是 在C++中也可以,但我不知道有哪个编译器可以 它。 而且操作系统并不总是让它变得那么容易。 -
这是操作系统问题,而不是语言问题。 现代操作系统 不允许程序访问自身内存之外的内存 进程空间,所以Java和C++都不允许。
-
如上所述,这是操作系统问题,而不是语言问题,并且 现代操作系统相对很好地执行了它,无论是否 该程序是用Java或C++编写的。
总之,2 和 3 都是不可能的,无论 语言,并且 1 不会出现在写得很好的C++中(尽管它是 过去 C 的问题)。
Java是一种相当安全的语言,原因有几个,主要集中在你的 3 点上,Java 比其他语言更安全,主要是因为它在自己的虚拟机中执行字节码指令,而不是本机代码。它不允许越界数组访问,并且没有指针访问。这几乎回答了你的前 2 点。 至于未经许可的阅读和写作,我不确定你的意思。文件读取和写入本质上是在操作系统级别控制的。如果没有一些漏洞来获得比它应该得到的更多的权限,无论它是用什么语言编写的,程序都无法写入或读取操作系统禁止它的文件。如果您的意思是从应用程序的角度来看未经许可,例如从插件系统的角度来看,那么您需要考虑添加安全管理器或您自己的审查,以防止插件或模块更改应用程序进程下的文件。
安全性是相对的。当Java在虚拟机中运行时,它可以保护它自己解决C语言中的一些经典问题。
超越例行堆栈 - 蠕虫和病毒的常见攻击
Java有一个定义的行为,抛出一个StackOverflowError,你不能绕过这一点。
损坏其自身进程空间之外的内存
恕我直言,这确实是一个操作系统考虑因素。 即使在 C 语言中,您的操作系统也可以保护您的进程不被修改其他进程的内存。 Java 保护您,无论操作系统是否提供此功能,我都不允许您访问任意内存位置。 大多数现代操作系统都提供这种保护。
未经许可读取或写入文件。
同样,您的操作系统可以保护您免于在 C 中执行此操作,并且应该是您的第一道防线。 Java所做的是允许你运行不受信任的代码,并保护你的文件,即使你可以访问它们,但阻止你的一个程序访问它们。 Java有两种机制,SecurityManager和AccessControl。
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种简单的方法来检查C++中的不安全表达式
- 是否有一种安全的方法可以断言字符串视图是否以 null 终止?
- 一种安全、符合标准的方法,使类模板专用化仅在实例化时才无法使用"static_assert"进行编译
- 解释Java作为一种安全语言?
- 这是否是一种传递临时对象的安全方式
- 以这种方式返回对新创建的对象的引用,这是一种安全的做法
- 有没有一种安全的方法可以迭代 std::unique_ptr<int[]>?
- 有没有一种安全的方法可以在不触发溢出的情况下获得有符号整数的无符号绝对值
- 是否有一种方法可以机械地识别在移出对象上哪些操作是安全的
- 在c++中是否有一种安全的方式来执行来自用户/客户端的代码?
- 我如何使连续内存以一种安全的方式表现多态
- 线程安全队列是一种好方法吗?
- C++ - 一种确保调用全局清理函数的异常安全方法
- while(stringstream >> var1 >> var2)是一种安全的做法吗?