我知道在 Java 中运行的 Windows 服务在安全级别上存在缺陷,因为这意味着 JVM 正在服务线程中运行,因此潜在威胁的数量增加了。
C# 呢?C# 在 CLR(公共语言运行时)上运行,所以当我说它也可能导致一些严重的安全漏洞时我错了吗?
我知道在 Java 中运行的 Windows 服务在安全级别上存在缺陷,因为这意味着 JVM 正在服务线程中运行,因此潜在威胁的数量增加了。
C# 呢?C# 在 CLR(公共语言运行时)上运行,所以当我说它也可能导致一些严重的安全漏洞时我错了吗?
好吧,CLR 实施了几种安全措施,以实际提供额外的安全层并避免 JVM 的一些陷阱。
首先,您的代码是您的,它将按原样执行,它不会像 Java 那样在虚拟机上进行解释和运行。当您在 .NET 中生成程序集或 exe 文件时,您将获得 IL 代码,即中间语言代码。
然后将该 IL 及时编译为机器代码,然后执行该机器代码。没有虚拟机可以解释它,一旦代码被编译成特定机器的汇编程序,它就会像用标准语言编写的任何其他程序一样执行。
当您执行 .NET 程序时,程序上的第一条指令实际上会加载 CLR,而 CLR 又会查找程序的主入口点并开始执行。CLR 加载程序位于 mscorlib.dll 中,而后者又位于GAC中。
现在,GAC 本身确实包含一些安全措施,最重要的是位于 GAC 中的程序集(当然包括来自 Microsoft 的程序集)是强命名的,换句话说,它们是经过签名的。
Microsoft 保留他的私钥并对任何版本的 .NET Framework 的每个程序集进行签名,然后在 GAC 上安装后,根据 Microsoft 公钥检查该签名以查看它们是否匹配。当您使用 Visual Studio 引用 .NET 框架版本时,该过程会自动为您完成,尽管它可以在编译期间通过命令行显式完成。
所以简而言之,不,它不会导致同样的安全漏洞。