求解软件项目中开源组件最优版本的方法及系统与流程

文档序号:31074633发布日期:2022-08-09 21:32阅读:114来源:国知局
求解软件项目中开源组件最优版本的方法及系统与流程

1.本发明涉及开源组件版本分选技术领域,尤其涉及一种求解软件项目中开源组件最优版本的方法及系统。


背景技术:

2.在软件开发领域,一般通过软件成分分析(sca,software composition analysis)工具分析项目中的第三方组件成分(开源组件),并显示这些组件成分的漏洞和许可等风险信息,并且会给这些有问题的第三方组件推荐一个替换版本来解决问题,替换版本虽然可能修复当前组件的问题,但是,由于项目中的各个开源组件之间存在相应的依赖关系,因此,替换版本后,有可能会引出新的问题组件出来。所以从根本上无法解决项目中第三方组件的问题。


技术实现要素:

3.本发明的目的是为解决上述技术问题的不足而提供一种可综合项目中所有开源组件而给出最优推荐版本从而避免无效替换的求解软件项目中开源组件最优版本的方法及系统。
4.为了实现上述目的,本发明公开了一种求解软件项目中开源组件最优版本的方法,其包括:
5.分析目标项目中的开源组件的依赖关系,以生成具有树图结构的依赖关系树;
6.根据深度优先策略,采用回溯法,从所述依赖关系树的每一根节点开始,依次遍历处理所述依赖关系树的每一子树;
7.对于任一所述子树的遍历处理方法包括如下步骤:
8.a:判断任一节点处的开源组件的风险度是否大于预设值,如果否,则执行步骤b,如果是,则执行步骤c;
9.b:将该子树的根节点处的开源组件定义为该子树的其中一分选解,并记录当前所述依赖关系树的信息,并进入步骤c;
10.c:对该子树的根节点处的开源组件的版本进行替换,并重新生成所述依赖关系树;
11.d:如此循环执行上述步骤a至c,直到将该子树根节点处的开源组件的所有版本替换完毕,以获得该子树的分选解集合;
12.通过对所有子树的分选解集合进行综合分析,以得到与该目标项目相对应的综合解集合;
13.根据所述综合解集合,结合上述记录的与每一所述分选解相对应的依赖关系树,解析出与该目标项目相对应的开源组件推板版本的最优解集合。
14.较佳地,还包括对目标项目的预处理方法:采用开源成分分析工具对所述目标项目进行处理,以获得该目标项目中的开源组件,同时获得每一所述开源组件的漏洞利用难
度,并对所述漏洞利用难度进行量化;
15.根据所述开源组件的源代码和所述依赖关系树对每一所述开源组件漏洞的可达性进行分析并量化;
16.在所述遍历方法中,通过所述开源组件的漏洞利用难度和可达性来评估所述风险度。
17.较佳地,在所述遍历处理方法中,在步骤a中,当判断结果为是时,同时记录当前子树的依赖信息;
18.如果某一所述子树不存在分选解,分别针对该子树根节点开源组件在每一版本下的依赖信息,计算该子树的风险度,取风险度最低者所对应的开源组件作为该子树的分选解。
19.本发明还公开一种求解软件项目中开源组件最优版本的系统,其包括依赖关系树生成模块和关系树处理模块;
20.所述依赖关系树生成模块,用于分析目标项目中的开源组件的依赖关系,以生成具有树图结构的依赖关系树;
21.所述关系树处理模块,用于根据深度优先策略,采用回溯法,从所述依赖关系树的每一根节点开始,依次遍历处理所述依赖关系树的每一子树,所述关系树处理模块包括分选解集合生成模块、综合解生成模块以及最优解集合生成模块;
22.所述分选解集合生成模块,包括遍历模块、收集模块、记录模块、替换模块、更新模块、第一解析模块和第二解析模块;
23.所述遍历模块,用于遍历检测任一所述子树的任一节点处的开源组件的风险度;
24.所述收集模块,用于收集任一节点的风险度均不大于预设值的子树的根节点的开源组件,并将该开源组件定义为该子树的其中一分选解;
25.所述记录模块,用于记录存在有节点的风险度大于预设值的子树当前所对应的依赖关系树信息;
26.所述替换模块,用于对所述子树中的根节点处的开源组件版本进行替换;
27.所述更新模块,用于在每次替换开源组件后,对目标项目的依赖关系树进行更新;
28.所述第一解析模块,用于根据所述收集模块收集到的所有分选解,解析出与该目标项目相对应的综合解集合;
29.所述第二解析模块,用于根据所述记录模块记录的内容和所述综合解集解析出与该目标项目相对应的开源组件推板版本的最优解集合。
30.较佳地,还包括第一预处理模块、第二预处理模块和风险度评估模块;
31.所述第一预处理模块,用于采用开源成分分析工具对所述目标项目进行处理,以获得该目标项目中的开源组件,同时获得每一所述开源组件的漏洞利用难度,并对所述漏洞利用难度进行量化;
32.所述第二预处理模块,用于根据所述开源组件的源代码和所述依赖关系树对每一所述开源组件漏洞的可达性进行分析并量化;
33.所述风险度评估模块,用于通过所述开源组件的漏洞利用难度和可达性来评估所述风险度。
34.本发明还公开一种求解软件项目中开源组件最优版本的系统,其包括:
35.一个或多个处理器;
36.存储器;
37.以及一个或多个程序,其中一个或多个程序被存储在所述存储器中,并且被配置成由所述一个或多个处理器执行,所述程序包括用于执行如上所述的求解软件项目中开源组件最优版本的方法的指令。
38.本发明还公开一种计算机可读存储介质,其包括计算机程序,所述计算机程序可被处理器执行以完成如上所述的求解软件项目中开源组件最优版本的方法。
39.与现有技术相比,本发明求解软件项目中开源组件最优版本的方法,从整个目标项目的角度出发,在分析每个开源组件的风险度的基础上,综合目标项目中所有的开源组件给出一个最优的版本推荐集合,即,针对不同的目标项目,相同的开源组件可能会存在不同的推荐版本,从而避免无效的开源组件版本推荐,使得推荐更加有效,以适配当前目标项目。
附图说明
40.图1为本发明实施例中求解软件项目中开源组件最优版本的方法流程图。
41.图2为图1中遍历处理方法流程图。
42.图3为本发明实施例中依赖关系图结构示意图。
43.图4为图3中子树1的根节点的开源组件版本更换后重新生成的依赖关系树。
具体实施方式
44.为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。
45.本实施例公开一种求解软件项目中开源组件最优版本的方法,以用于在软件开发项目中对所用到的开源组件的版本进行最优的有效推荐,在项目中使用所推荐的相应版本的开源组件,不会引入新的风险。为便于理解本实施例中的方法,首先对所涉及到的基础知识做以说明。在软件开发项目中,为提高开发效率,一般会使用大量的开源组件(又叫第三方组件),通过软件成分分析工具(sca)可以分析出项目中所用的开源组件。对于每一项目来说,其所用的若干开源组件之间又存在着依赖关系,按依赖层级可将这些开源组件分为直接依赖组件与间接依赖组件,项目所依赖的第一层级的开源组件被称为直接依赖组件,第一层级以及更深层级开源组件所依赖的开源组件被称为间接依赖组件。如图3所示的目标项目的依赖关系树,其中有两个子树,子树1和子树2,该两个子树分别有一个直接依赖组件,分别为da1和db1,直接依赖组件da1下有三个间接依赖组件ic1、id1、ie1,直接依赖组件db1下有一个间接依赖组件if1,da1表示直接依赖组件a的版本1,ic1表示间接依赖组件c的版本1,其他雷同,不再赘述。
46.由于大部分间接依赖组件的风险是其直接依赖组件带来的,因此,本发明实施例中,仅针对直接依赖组件进行版本推荐替换,但同时应了解的是,当直接依赖组件的版本被替换后,也可能会造成间距依赖组件的变化。
47.具体地,如图1,本实施例中求解软件项目中开源组件最优版本的方法包括如下步骤:
48.s1:获取目标项目中所涉及到的所有开源组件。
49.s2:分析目标项目中的开源组件的依赖关系,以生成具有树图结构的依赖关系树,如图3。
50.s3:根据深度优先策略,采用回溯法,从所述依赖关系树的每一根节点(da1/db1)开始,依次遍历处理所述依赖关系树的每一子树;
51.如图2,对于任一所述子树的遍历处理方法包括如下步骤:
52.a:判断任一节点处的开源组件的风险度是否大于预设值,如果否,则执行步骤b,如果是,则执行步骤c;
53.b:将该子树的根节点处的开源组件定义为该子树的其中一分选解,并进入步骤c;
54.c:对该子树的根节点处的开源组件的版本进行替换,并重新生成所述依赖关系树;
55.d:如此循环执行上述步骤a至c,直到将该子树根节点处的开源组件的所有版本替换完毕,以获得该子树的分选解集合。
56.s4:进而通过上述遍历处理方法获得所述依赖关系树中所有子树的分选解集合;
57.s5:通过对所有子树的分选解集合进行综合分析,以得到与该目标项目相对应的综合解集合;
58.s6:根据所述综合解集合,结合上述记录的与每一所述分选解相对应的依赖关系树,解析出该目标项目相对应的开源组件推板版本的最优解集合。
59.下面对上述方法流程的原理进行进一步详细说明。
60.在目标项目中,涉及到的开源组件有五个,分别为a、b、c、d、e、f,生成的依赖关系树如图3所示,其中a、b为直接依赖组件,c、d、e、f为间接依赖组件。
61.采用遍历处理方法对子树1进行处理:
62.首先对da1(直接依赖开源组件a,版本1)风险度进行判断,然后是ic1,接着是id1,然后回溯到ic1,从ic1进入ie1,再从ie1回溯到da1,如果da1、ic1、id1、ie1中有一个风险度大于预设值,则对位于子树1根节点处的da1的版本进行替换,将其升级为版本2,即da2,由于更新直接依赖组件后,间接依赖组件也可能发生改变,因此可能会影响项目中其他多个间接依赖,所以,需要重新生成依赖关系树,如图4,生成的新的依赖关系树后,ic1变为了ic2,然后,基于重新生成的依赖关系树,从子树1的da2进行风险度判断,直到ie1,如果da2、ic2、id1、ie1中任何一个风险度均不大于预设值,则将da2作为该子树1的其中一分选解,同时记录下当前依赖关系树的信息,以便于后续比对分析。如果开源组件a还有版本3,继续对da2进行替换,将其替换为da3,并根据上述流程判断da3是否属于子树1的其中一分选解,以此类推,找出子树1的所有分选解,以构成子树1的分选解集合,如{a2、a3、a5}。
63.根据上述对子树1的处理方式,对目标项目中的子树2进行处理,得到子树2的分选解集合{b2、b4、b5}。
64.根据子树1的分选解集合和子树2的分选解集合,得到与目标项目对应的综合解集合:{(a2、b2)、(a2、b4)、(a2、b5)、(a3、b2)、(a3、b4)、(a3、b5)、(a5、b2)、(a5、b4)、(a5、b5)}。
65.本领域技术人员知道,在软件项目中,某一直接依赖组件改变后,会影响其所属子树的间接依赖组件的改变,这就可能会影响到项目的整体风险情况,因此,根据上述记录的与每一所述分选解相对应的依赖关系树,比对每一对综合解(如a2、b2)是否出现冲突,例
如,根据分选解da2记录的依赖关系树,子树1中的间距依赖组件ic1变成了ic2,同时,根据分选解db2记录的依赖关系树,在子树2中引入了间接依赖组件ic1,而在同一个项目中,对于同一开源组件不能出现两个版本,所以,这一对综合解(a2、b2)即为无效解。因此,根据所述综合解集合,结合上述记录的与每一所述分选解相对应的依赖关系树,解析出与该目标项目相对应的开源组件推板版本的最优解集合,例如{(a2、b4)、(a3、b4)、(a3、b5)}。
66.进一步地,本发明求解软件项目中开源组件最优版本的方法另一较佳实施例中,还包括对目标项目的预处理方法:
67.采用开源成分分析工具对所述目标项目进行处理,以获得该目标项目中的开源组件,同时获得每一所述开源组件的漏洞利用难度,并对所述漏洞利用难度进行量化;
68.根据所述开源组件的源代码和所述依赖关系树对每一所述开源组件漏洞的可达性进行分析并量化。
69.在所述遍历方法中,通过所述开源组件的漏洞利用难度和可达性来评估所述风险度。
70.本实施例中,通过对目标项目的预处理,为对开源组件风险度的评估提供了便利。具体地,本实施例中,通过评分策略对开源组件的漏洞利用难度和可达性进行量化。通过开源成分分析工具获取开源组件的若干及其漏洞利用难度后,由于漏洞利用难度分为高易利用和不易利用,因此,将高易利用的漏洞的风险设置为100分,将不易利用的漏洞的风险设置为1分。同理,漏洞的可达性包括可达和不可达,将可达的漏洞的风险设置为100分,将不可达的漏洞的风险设置为1分。然后,根据量化出的漏洞利用难度和可达性综合计算每一开源组件的风险度,风险度大于100分的设置为超危或高危,应替换为其他版本,也即将上述实施例中用于判断任一节点处的开源组件的风险度的预设值设置为100。
71.另外,在通过上述遍历处理方法时,还有可能出现某一子树不存在分选解的情况,也即对于该子树来说,不出任何一版本的作为根节点处的开源组件,使得该子树任一节点处的开源组件的风险度小于预设值。对此,在所述遍历处理方法的步骤a中,当判断结果为是时,也即当前子树中有一节点处的开源组件的风险度大于预设值,当前子树根节点处的开源组件(如da1)为非分选解,那么,在对该子树根节点处的开源组件版本替换之前,先记录下当前子树的依赖信息。这样,后续如果该子树根节点处所有版本的开源组件均不能达到分选解的条件,那么,根据上述记录的子树的依赖信息,分别针对该子树根节点开源组件在每一版本下的依赖信息,计算该子树的风险度,取风险度最低者所对应的开源组件作为该子树的分选解。
72.综上,根据上述实施例本发明公开的求解软件项目中开源组件最优版本的方法,从整个目标项目的角度出发,在分析每个开源组件的风险度的基础上,综合目标项目中所有的开源组件给出一个最优的版本推荐集合,即,针对不同的目标项目,相同的开源组件可能会存在不同的推荐版本,从而避免无效的开源组件版本推荐,使得推荐更加有效,以适配当前目标项目。
73.本发明还公开一种求解软件项目中开源组件最优版本的系统,其包括依赖关系树生成模块和关系树处理模块。
74.所述依赖关系树生成模块,用于分析目标项目中的开源组件的依赖关系,以生成具有树图结构的依赖关系树。
75.所述关系树处理模块,用于根据深度优先策略,采用回溯法,从所述依赖关系树的每一根节点开始,依次遍历处理所述依赖关系树的每一子树,所述关系树处理模块包括分选解集合生成模块、综合解生成模块以及最优解集合生成模块。
76.所述分选解集合生成模块,包括遍历模块、收集模块、记录模块、替换模块、更新模块、第一解析模块和第二解析模块。
77.所述遍历模块,用于遍历检测任一所述子树的任一节点处的开源组件的风险度。
78.所述收集模块,用于收集任一节点的风险度均不大于预设值的子树的根节点的开源组件,并将该开源组件定义为该子树的其中一分选解。
79.所述记录模块,用于记录存在有节点的风险度大于预设值的子树当前所对应的依赖关系树信息。
80.所述替换模块,用于对所述子树中的根节点处的开源组件版本进行替换。
81.所述更新模块,用于在每次替换开源组件后,对目标项目的依赖关系树进行更新。
82.所述第一解析模块,用于根据所述收集模块收集到的所有分选解,解析出与该目标项目相对应的综合解集合。
83.所述第二解析模块,用于根据所述记录模块记录的内容和所述综合解集解析出与该目标项目相对应的开源组件推板版本的最优解集合。
84.进一步地,上述系统还包括第一预处理模块、第二预处理模块和风险度评估模块。
85.所述第一预处理模块,用于采用开源成分分析工具对所述目标项目进行处理,以获得该目标项目中的开源组件,同时获得每一所述开源组件的漏洞利用难度,并对所述漏洞利用难度进行量化。
86.所述第二预处理模块,用于根据所述开源组件的源代码和所述依赖关系树对每一所述开源组件漏洞的可达性进行分析并量化。
87.所述风险度评估模块,用于通过所述开源组件的漏洞利用难度和可达性来评估所述风险度。
88.关于本实施例中的系统的工作原理和方式详见上述方法实施例,在此不再赘述。
89.本发明还公开另一种求解软件项目中开源组件最优版本的系统,其包括一个或多个处理器、存储器以及一个或多个程序,其中一个或多个程序被存储在所述存储器中,并且被配置成由所述一个或多个处理器执行,所述程序包括用于执行如上所述的求解软件项目中开源组件最优版本的方法的指令。处理器可以采用通用的中央处理器(central processing unit,cpu),微处理器,应用专用集成电路(application specific integrated circuit,asic),或者一个或多个集成电路,用于执行相关程序,以实现本技术实施例的求解软件项目中开源组件最优版本的系统中的模块所需执行的功能,或者执行本技术方法实施例的求解软件项目中开源组件最优版本的方法。
90.本发明还公开一种计算机可读存储介质,其包括计算机程序,所述计算机程序可被处理器执行以完成如上所述的求解软件项目中开源组件最优版本的方法。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是只读存储器(read-onlymemory,rom),或随机存取存储器(random access memory,ram),或磁性介质,例如,软盘、硬盘、磁带、磁碟、或光介质,例如,数字通用光盘(digital versatile disc,dvd)、或者半导体介
质,例如,固态硬盘(solid state disk,ssd)等。
91.本技术实施例还公开了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。电子设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该电子设备执行上述求解软件项目中开源组件最优版本的方法。
92.以上所揭露的仅为本发明的优选实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明申请专利范围所作的等同变化,仍属本发明所涵盖的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1