在Java推出基于字节码的跨平台技术之后,Microsoft也为.NET推出了字节码解释模型(common language runtime)。对于两者的区别,我个人的观点一直是他们都可以开发出安全级别很高的应用软件,只是两者的开发形式、适用环境有一些区别罢了。对于安全问题,以前也经常有客户会问到两者之间的区别,当时也没有很在意,因为任何一方的安全级别都已经足够满足客户的要求了。也就是说即使有一些高低区别也没有大的关系。
Veracode是一家应用产品安全测试方案提供商,他们的服务是对二进制、字节码以及Web应用进行扫描,以发现安全问题。他们一直持续保留和收集着他们每次的扫描结果,并最近开始发布他们他们的扫描结果分析报告。因为他们的工作范围里,既有.NET应用,也有Java应用,因此我们可以通过他们的数据得到一些.NET和Java之间的安全差异证据。
需要说明的是,这些数据并不是出现在正式发布的报告当中(这些数据将可能出现在下一次修订当中。编辑注:也许是在等待厂商进行公关)。从这个报告的数据中可以看出:每MB代码中,.NET的漏洞密度为27.2,Java则为30.0。也就是单位数量代码中Java的安全漏洞要高于.NET。
对大多数人来说,这是一个非常接近的数字,也在抽样误差允许范围之内。可以认为.NET和Java的安全性在同一个级别范围内。但是如果将安全问题数据再进一步划分为不同类型的话,则会发现更有趣的事情,会发现在不同的方面.NET和Java的安全成都差异还是比较大的。
这是一个对.NET和Java开发者非常有用的数据。因为从报告中可以看到两个程序语言在哪些方面更容易出现安全问题,比如二者的跨站脚本攻击防范能力都不高(注:在Java Servlet 3.0规范中已经做了改进),所以设计应用的时候就要注意防范跨站脚本攻击问题,尤其是.NET更应该注意。在Veracode的说明中对这个问题的解释是:之所以.NET在防范跨站脚本攻击方面问题这么多,是因为老版本的.NET控制结构不会对输出进行编码,因此如果要使用.NET的话。确认一定要使用最新的控制结构。
最后需要注意的是,安全问题并不是选择一个程序语言,或者说是在.NET和Java之间,或者是构建在其上的产品之间的选择理由。一个完整的系统,要综合考虑应用领域环境、用户特点要求、未来维护发展等很多方面。