作者: 佚名 来源: 网络 日期:2024-11-04 14:43
目前,开源代码可以说是无处不在,几乎所有的软件中都有开源代码的身影。在现在的软件编程中,代码引用极为常见,很少有哪个编程人员敢说自己编写的软件中的每一行代码都是自己写的,基本所有的软件都会或多或少的引用外部代码,这些外部代码中大部分都是开源代码(OSS)。
使用开源代码的好处很多,但也会带来风险,为了更好的使用开源软件,发挥开源软件的价值的同时又避免其带来的风险,就要对使用的开源软件进行一定的管理,而开源软件管理的基础就是要弄清楚你使用了哪些开源软件,而要弄清楚软件中究竟用了哪些开源代码,通常是件很难的事情。为了发现软件中存在的开源代码,以及由这些开源代码引入的风险,需要对软件代码进行检测。如果想全面准确的找到软件中的开源代码和风险,用人工的方法是不可能的,一般都会使用检测工具来进行这项工作(因为开源代码的总规模是个天量,没有人能知道所有的开源代码,而且现在的软件产品的代码规模通常也很大,用人工方式去阅读所有代码也是不现实的)。
要实现有效的开源代码检测,对检测工具的要求至少有以下几个方面:
全面、准确发现软件中的开源代码
这是基础的要求,只有全面准确的检测出软件中的开源代码,才谈得上分析其中的风险。要实现这一点,不仅需要全面准确的开源软件数据,还需要好的检测技术和分析算法。
准确、详细的开源代码风险信息
检测出开源代码的同时,还要能分析和展示这些开源代码的风险信息,这需要开源代码检测工具的拥有全面准确的开源软件数据。
持续跟踪并发现新的风险
每个开源软件都是在不断变化的,其风险也不是固定不变的,开源代码检测工具还要能够持续的发现新的风险,这其实是对开源检测工具的数据更新能力的要求。
前面已经说过,开源检测工具的优劣主要和三方面相关,即:开源软件数据的准确性与全面性、分析检测的技术、数据更新能力。在数据的准确性与全面性、以及数据更新能力方面,各款工具都标榜自己的知识库是最全、最大、最领先的,也都说自己的数据更新非常及时等等。因为缺乏详细的数据进行对比,所以本文先搁下这些方面不谈,只讨论一下开源代码的检测分析技术。
目前存在两种主流的扫描检测技术:代码特征分析比对技术、代码依赖关系分析技术。在具体分析这两种技术之前,我们先举个例子:
比如有一种饮料,我们想知道其中都含有哪些化学成分,我们可以通过解读饮料包装上的成分表去了解,也可以通过对饮料本身做各种化学实验分析去得到。在开源代码检测分析中,代码依赖关系分析技术就类似于成分表解读的方式,而代码特征分析比对技术就类似于化学分析的方式。
代码特征分析比对技术的本质是比对两份代码中是否有相同的部分,该技术时对软件源码中的每一个代码文件进行分析和比对,该技术其实不只用于检测代码中是否有开源代码,也可以用于代码同源检测等领域。其工作的基本原理如下:
这和我们用MD5值验证下载文件的完整性的方法是类似的,只是检测工具在进行代码特征比对分析时要批量处理文件、批量比对和展示结果。
另外,不同的工具其特征提取的方法也不相同,有些只提取整个代码文件的特征,这种方式只能分析出
而有些工具不仅提取整个代码文件的特征,还对其中的代码片段提取特征,从而不仅能分析出
还能分析出
在开源代码扫描检测中使用代码特征分析比对技术时,如果想获得好的效果,取决于以下几个方面:
代码依赖分析技术是基于分析软件中依赖的外部组件列表来分析软件中使用的开源代码,该技术是针对整个软件进行分析的(或者说是对软件中记录依赖关系的文件的内容进行分析,比如Java 代码中的.pom文件),而不是针对每一个代码文件进行分析,其工作原理如下:
不同的检测工具在实现时也有所差别,有的工具不仅能分析出A 中列出的直接依赖的开源组件,还会对依赖的外部开源组件进行递归分析,得出类似于下面这样的结果:
代码依赖关系分析技术的效果主要取决于:
上述的这两种技术各有利弊,需要根据您的具体需求和应用环境来选择。这两种技术各自的特点对比如下:
代码特征分析比对技术
代码依赖关系分析技术
以上对这两种技术的对比分析,是基于这两种技术本身的特点来说的,分析的是这两种技术本身的差异,而非使用这些技术的开源代码扫描检测工具之间的差异。使用不同技术的开源代码检测工具之间,因其在技术水平、开源软件数据库质量等方面存在差异,其检测能力也存在差异,不能简单的说使用某种技术的工具就一定优于使用另一种技术的工具;即使是使用相同技术的两种检测工具之间,其检测能力通常也有不小的差别。