针对不同的目的,扫描SAP系统中的ABAP代码有助于收集不同类型的信息。
例如:
用于检测ABAP级别的安全漏洞在ABAP码中检测硬编码值获取自定义(Z)开发中使用的外部RFC调用的列表为了得到数据库表的列表–使用的字段(例如在S4HANA转换之前)
在我的公司Novaline中,我们编写了一个名为"ABAP Optimizer"的工具,它扫描ABAP代码的性能漏洞,然后进一步自动修改ABAP代码以优化性能。(请看我的上一篇博客)
在这个博客中,我将分享一些关于扫描ABAP代码的编码细节。
基本:阅读ABAP源代码
基本上我们可以通过ABAP命令阅读ABAP include的源代码"READ REPORT".
下面是一个简单的报告:
要得到这个的源代码,我们可以使用下面的"READ REPORT"命令:
READ REPORT命令用报告"ZTEST"的源代码填充字符串内部表"gt\u source"。
这样做,我们只有一个纯字符串表的源代码。没有关于代码的解释。
但是,只需编写一个简单的ABAP扫描器,它只搜索ABAP代码中的一些特定文本,我们就可以从SAP view TRDIR中读取自定义报表列表,并通过"read REPORT"命令逐个读取它们的ABAP代码。。最后我们可以在代码中进行简单的文本搜索。
SAP程序"RS\u ABAP\u SOURCE\u SCAN"已经在做这个搜索了,您可以参考它作为一个例子。看看这个页面,看看它的一些好处。
那么解释代码呢?让我们进入更多细节。
解释ABAP代码
很久以前,当我第一次尝试编写SAP安全扫描工具时,我花了时间在"SAP代码检查器"工具上,试图理解它是如何分析ABAP代码并进行检测的。
下面是一些重要的概念,在我们进一步讨论之前需要知道:
概念:
标记化:意味着将ABAP代码从纯字符串解析为有意义的结构。如果你像我一样喜欢阅读理论,那么请查看本页。
声明:我们完成的每个ABAP命令都有一个句点记号:ABAP语句中的每个单词都是记号。。不管它是ABAP关键字、文字还是变量名结构:有些语句相互绑定。。例如,云100,一个ABAP循环语句在代码的某个地方以ENDLOOP语句结束,所以它们都表示一个结构
所以想象一个ABAP代码部分如下:
让我们把概念放在它上面:
您可以在通过READ REPORT命令获得代码后,自己解析字符串来获得这些结构,物联网是什么,或者您可以使用现有的类在SAP代码检查器中,使其更简单。请查看标准类"CL\u CI\u SCAN"。(它基本上是在引擎盖下使用SCAN ABAP-SOURCE命令。)
那么通过使用这些逻辑和信息,如何编写ABAP解释器?
在如上所述标记代码之后,第二步应该是分析您感兴趣的命令或语句。解释取决于您试图检测的内容。
让我们继续下面的示例场景。
基本示例:
让我们编写一个ABAP扫描器,它检测与"*"一起使用的SELECT命令以读取所有数据库表字段。
步骤如下:
想象一个小ABAP程序如下:
第二个SELECT语句要读取VBAP表格,请使用星号"*",我们正在尝试检测这些SELECT语句。
让我们在ABAP中对扫描仪进行编码:
(我将代码共享为图像,人工智能有哪些领域,以使其更易于理解,但如果您要求,我也可以将代码共享为文本)
在下面的报告代码中,参数"p\u prog"将是系统中现有的ABAP程序名。
让我们为上面的程序"ZTEST"运行它,并在调试器中显示对象"gr\u scan","statements"和"tokens"表在此对象上可见:
让我们显示"tokens"表:
并显示"statements"表通知"from"和"to"字段:
"from""statements"表中的"to"字段显示每个语句在"tokens"表中的索引。
基本上"statements"表保留所选ABAP程序中的每个命令,我们可以通过"tokens"表上的from/to字段访问语句中的每个token.
判断语句是否为SELECT,我们可以只检查第一个令牌。
同样通过检查第二个令牌,什么是物联网工程,我们可以看到SELECT是否被星号(*)使用。
扫描器代码的剩余部分如下:
基本上扫描ABAP代码就是这么简单,但真正困难的部分是从你开始编码一个分析器来检测不同的现象开始的。上面的例子只是扫描一种命令类型(SELECT),它与代码中的任何其他命令都不相关。
让我们想象一个扫描仪在循环下检测SELECT命令,别忘了SELECTs可以在PERFORM、METHOD调用或宏调用等子程序调用下进行。
要检测复杂的状态,它需要更详细的类、逻辑和非常规测试用例。
我将在以后的博客中尝试写一篇关于建模这样的复杂类的博客。
,物联网模块