基于静态分析和动态运行的Web应用JavaScript代码原子性违反检测的制作方法_2

文档序号:9375480阅读:来源:国知局
异步调用函数体:一个函数的内部funBody包括整个请求的主体部分,包括发 送对象targetOb ject (服务器端地址),发送数据requestData (JS0N格式数据),发送格式 requestType(get/post)〇
[0028] (3)回调函数:当请求被接收,并被处理后,目标对象会发送相应的反馈给 请求对象requestObject,接收到回应后,回调函数被调用。回调函数包括函数状态 callBackState、函数操作 callBackOperation。
[0029] 根据函数调用具体内容的不同,我们设计出原子性违反判定的基本规则,这些基 本规则都是对原子性违反语法上的约束,一个操作满足其中任何一个规则都被视为原子性 违反:
[0030] 规则1 :同一个事件源在异步调用了某一个函数时,若回调函数还没有被调用或 还没有执行相应的操作,该事件源就调用了另一个异步调用;
[0031] 规则2 :两个异步调用含有对某一个全局变量操作或有类似发送数据函数体被不 同数据源同时调用;
[0032] 规则3 :目标对象处理请求过程中,还没有返回相应结果时,其它事件源对相同目 标对象发出类似的异步调用;
[0033] 规则4 :当一个异步调用中回调函数的操作涉及某一个事件源,而在相应操作实 施前,涉及的事件源有了其它异步调用;
[0034] 规则5 :多个回调函数中的回调操作中均涉及对同一个事件源的操作。
[0035] 步骤3)采用动态分析方法检测原子性违反:通过插粧获取并记录Web应用运行时 的异步调用中函数、变量和数据的交互信息,通过对应判定条件的比较,实现对全局过程的 原子性违反判断。首先需要对JS代码进行插粧,以获得运行时需要的具体元素。插粧是指 在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行以抛出 程序运行的特征数据,分析这些数据,可以获得程序的控制流和数据流等信息,进而检测程 序中是否包含各种缺陷。
[0036] 根据探针插入的时间不同,插粧可以分为目标代码插粧和源代码插粧。我们的目 的是检测JS代码中涉及的原子性违反,属于源代码级别的插粧。
[0037] 用于插粧的探针本质上是采集信息的代码段,可以是赋值语句或采集覆盖信息的 函数调用。只有通过探针的执行才能输出程序的运行特征数据。原子性违反涉及到HTML 页面和JS脚本,需要记录页面中的事件源。若对一个页面中所有元素设置探测点,会产生 巨大的运行开销,另外由于探测点繁多混乱,会导致插粧代码无法顺利运行。我们关注的原 子性违反操作主要集中于函数间的调用,可将探测点设置在事件源调用的注册事件函数体 中。为了减少开销、保证插粧的效率,本发明将探测点放置在函数第一条执行语句前面,当 程序运行到探测点时,会进入插粧的记录函数中,既可以记录函数内执行路径,也可以探测 函数间调用的顺序。
[0038] 步骤4)动态运行Web应用,获取运行轨迹,即根据事件交互的流程,记录涉及的 HTML和JS元素的运行轨迹信息。我们在工具Jalangi的基础上来获取与原子性违反相关 的运行时信息。
[0039] Jalangi是加州大学Koushik教授在2013年设计出的高效JS插粧工具,它是一个 对前端和后端JS进行动态分析的框架,允许监控每个JS程序的操作以及编写自己的程序 分析代码;通过记录-回放的机制来实现JS代码的插粧,并通过影子执行的方法运行自定 义的动态分析脚本。在记录阶段,Jalangi通过一个稀疏数组trace来记录每条JS语句中 对象的值和类型。为了提高记录的效率,减少因探测点过多而造成的开销,Jalangi只记录 服务调用过程发生变化的对象(变量或函数),为记录的对象分配一个后续动态分析中定 义的影子值(shadowValue);在回放阶段,Jalangi结合第三方的动态分析脚本,通过影子 值的执行,来获取插粧后JS代码特定的运行轨迹和运行时产生的数据。
[0040] 我们使用工具Jalangi对JS代码进行插粧,影子值设置为对象类型和函数间调用 的符号化表示,保证插粧能获取异步调用中具体的函数执行顺序和回调操作;同时,依据步 骤2)中提出的原子性违反判定规则,将涉及异步调用操作的元素信息转换成判定条件,以 检测Web应用中的原子性违反。
[0041] 步骤5)根据步骤4)中所得的判定条件,编写动态原子性违反分析的脚本,主要包 括传递参数、返回值及相应的判断函数,集成到Jalangi的第三方脚本分析库中Jalangi 在回放阶段会自动调用并执行脚本进行分析,在控制台中输出原子性违反的判定结果, true表示没有原子性违反,false则含有原子性违反。
[0042] 需要说明的是:当我们选取的运行轨迹经解析,按静态分析中记录的元素类型得 到对应的元素信息后,若对应的记录元素过少,可以酌情进行选择或者丢弃。
[0043] 整体来看,本发明中原子性违反的检测根据常见原子性操作提出的判定规则,再 加上根据异步调用特有行为而制定的其它规则,基于运行轨迹中元素记录而产生相应的判 定条件,再将判定条件编写成脚本执行。这种融合了静态分析和动态运行的检测方法能够 适应JS语言的动态特性,在可操作性和执行效率上更具有代表性和说服力。
[0044] 通过采用以上技术方案,本发明具有以下优点:
[0045] 1.跨语言的元素记录:本发明使用元素记录的方法,将依据程序语言的不同,整 个原子性操作流程中涉及到的元素都进行记录,如浏览器端的HTML和JS中函数,使得原子 性违反的检测更全面、更精确。
[0046] 2.执行路径的筛选:执行路径的选取在某一方面也影响着检测方法。通常执行 路径的选取很自由,本发明通过代码级别的分析为后面运行轨迹生成做了进一步精确的筛 选,从而提高了执行路径中检测到含有相应原子性违反操作的可能性。
[0047] 3.动态分析脚本:本发明通过动态执行JS代码获得的运行轨迹,将原本抽象的 原子性违反用运行轨迹中记录的元素表示成具体的判定条件,再编写成相应的动态分析脚 本,这样使分析更具有针对性,有效提升检测精度。
【附图说明】
[0048] 图1为本发明的结构流程图。
[0049] 图2为元素记录图。
[0050] 图3为注册表单异步提交的具体流程。
【具体实施方式】
[0051] 本发明方法结合静态分析和动态分析方法处理Web应用中JS代码相关的原子性 违反问题,即:通过静态分析,选取Web应用请求-回应整个流程中涉及的相关元素进行记 录;再依据原子性操作具有的抽象化特征来设计原子性违反的判定规则;然后运用动态分 析技术,从运行轨迹中抽取出需要分析的元素和运行时信息,将规则转化为具体的判定条 件;最后,将分析脚本集成到工具Jalangi中运行,判定该异步调用的流程中是否存在违反 原子性的操作。
[0052] 本发明的流程如图1所示,具体包括如下五个步骤。
[0053] 第一步:为了保证运行轨迹对检测方法的体现效果,使用JS_WALA对代码进行静 态分析,得到JS代码的控制流图Graph (Nodes,Edges),控制流图每个节点Nodes表示具体 的JS函数语句,节点有前驱、后继属性,分别表示与其它节点的被控制和控制关系;再获取 JS代码中涉及到异步调用操作的函数和方法,记录在列表asynElementsList中:得到运行 轨迹后,按asynElementsList中的元素提取相应的信息,若得到信息过少,可酌情选择丢 弃,保证能够选出含有原子性操作的运行轨迹。
[0054] 第二步:通过分析异步调用流程中涉及到的不同语言,将完整的Web应用服务进 行语言模块划分;在各个模块中,根据每个在模块中具体功能、行为的不同,分别考虑后续 动态分析需要的相关信息,用插粧的方式获取对应的元素 relatedElements。
[0055] 如图2所示,我们将异步调用操作划分为HTML页面模块htmlPageModule和JS 模块JSModule,各模块需要记录的元素分别定义为页面元素 pageElements和脚本元素 JSElements。下面分别说明各模块具体记录的内容:
[0056] (I)HTML 页面模块
[0057] 浏览器作为与用户直接交互的界面,其在Web应用中起着决定性作用。前端浏览 器界面的友好性是用户对于Web应用最直观的第一感觉,而浏览器本身对于用户又呈现两 个部分,一个是显式部分,即HTML页面的排版和布局;一个是隐式部分,浏览器中涉及页面 和服务器端的脚本的元素。
[0058] Web应用是基于事件的应用,而HTML页面模块提供事件的发生源和处理结果源。 因此,页面元素需要记录的有:HTML元素的标签、CSS布局中用于识别标签的class属性、唯 一标识某一标签或域的ID属性、input标签用于绑定输入的name属性以及表单操作中提 交类型、提交地址等。
[0059] 本发明将需要记录的页面元素分为两类:页面标签属性attr和CSS布局属性 class。
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1