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

文档序号:9375480阅读:来源:国知局

[0060] pageElements :attr :完整的HTML页面是由HTML中各个标签按一定的布局组合 而成的,而在一个应用中,标签通常作为一个事件的发起。例如:当用户点击一个超链接阅 读一篇文章或观看一张图片时,使用鼠标移到选中的位置点击后,系统便会通过识别点击 对象中超链接<a>的属性href的地址,获取地址中的消息,并将其返回给用户;当页面中有 多个同样的超链接<a>,并且绑定不同的操作地址,系统会通过查询该标签中的ID属性,精 确识别到该标签,并对其做出相应的操作。
[0061] 通过记录一个标签的属性,可以精确定位到事件源及后续返回的结果。因此,当一 个被记录的事件源发起异步调用后,可通过记录标签的ID属性,判定在HTML中是否有重 叠,来检测原子性操作的违反。
[0062] pageElements :class :HTML页面通常米用CSS来做页面布局,CSS赋予标签class 属性,以此作为CSS操作的识别器。例如,当用户点击注册或登录按钮时,原本隐藏的相应 表单会弹出,给用户输入消息,这里是对CSS中display属性进行了操作。Web应用中通常 将请求的结果以对页面CSS样式的操作来呈现给前端用户。因此,CSS样式是否和预料中 的变化一样,是原子性违反操作最直接的表现形式。
[0063] 异步调用的处理结果是通过对页面元素的处理来展示给最终用户的,从用户角度 来看,请求的发生到最后的回应需要保持一一对应。为保证不违反原子性,在Web应用的多 个交互过程中,多个回调函数对同一个页面元素的操作必须是互斥的。
[0064] (2) JS 模块
[0065] Web应用中异步调用是依靠 JS的支撑来实现的,因此原子性违反的检测主要涉及 JS模块。考虑到JS是基于事件的动态语言,并且具有闭包、匿名函数的特性,本发明记录的 脚本元素包括事件柄eventHandle、函数function和变量var。
[0066] JSElements :eventHandle :事件柄是一个预定义的委托,专用于表示不生成数据 的事件处理方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须创 建一个委托。JS允许用户自定义事件柄,并绑定到相应事件函数中,这种操作便于JS的动 态开发,使得程序的运行更具可控性。同时,也带来原子性违反的安全隐患。原则上某一个 事件源绑定的事件在某一时间只能运行一个,当多个绑定事件同时运行时,如鼠标单击事 件click和双击事件dbClick,会造成结果显示的不确定性,使用户对返回结果产生疑惑。
[0067] JSElements :function :这里记录的函数既包括事件绑定的函数,也包括异步调 用的回调函数。异步调用函数中通过引入相应JS库(如jQuery)来简化操作HTML元素的 方法。异步调用既包括前端服务器和后台数据库的调用,也包括脚本中函数间的调用。函数 体中操作多种多样,为了保证记录元素对检测更具有针对性,这里记录的函数信息有HTML 元素的操作和函数间操作,前者涉及到事件源处理,后者会牵扯到操作间内存访问的及变 量一致性的判定。
[0068] JSElements :var :上文中提出的函数间消息的记录,不包括对变量的记录,只记 录函数之间调用的关系。JS作用域是链式的,内部对访问外部的变量的访问,按照从内到 外的作用域链逐层进行查找。因此,为了保证在闭包中不出现预料外的访问,需对访问变量 进行记录,比较各个函数中定义的变量来观察操作中是否有错误的变量访问。同时在传递 的数据中,通常采用JSON格式进行封装:{' varNamel' valuel',' varName2' va lue2' }。因此,需记录varName以保证数据在传递和接收的过程中不和其它数据发生混淆。 [0069] 第三步:基于第一步中得到的含有异步操作的执行路径,通过JS_WALA工具构建 异步调用图,将异步操作抽象化,并从中获取基于模块的函数调用关系,通过在调用函数体 中安置探测点来对JS代码进行插粧,通过动态运行插粧代码,获取各模块中需要记录的相 关信息。同时,在Jalangi中使用符号执行的分析过程,将原子性操作抽象化,以便于制定 操作的原子性违反判定规则。
[0070] 操作抽象化指:将输入的具体操作流程,在保证不改变整体流程的前提下,按一定 的规则,去除流程中具体的值或函数,输出流程的大致执行路径,以此代表某一类型操作的 过程。按第二步中提出的模块,我们可以将异步调用抽象成模块间操作的集合,将整个JS 原子性违反的检测细分到保证各个模块间操作的原子性,设计出如下所示的原则性违反判 定规则:
[0071] 规则1 :同一个事件源在异步调用了某一个函数时,若回调函数还没有被调用或 还没有执行相应的操作,该事件源就调用了另一个异步调用;
[0072] 规则2 :两个异步调用含有对某一个全局变量操作或有类似发送数据函数体被不 同数据源同时调用;
[0073] 规则3 :目标对象处理请求过程中,还没有返回相应结果时,其它事件源对相同目 标对象发出类似的异步调用;
[0074] 规则4 :当一个异步调用中回调函数的操作涉及某一个事件源,而在相应操作实 施前,涉及的事件源有了其它异步调用;
[0075] 规则5 :多个回调函数中的回调操作中均涉及对同一个事件源的操作。
[0076] 第四步:基于第三步设计的原子性执行的模块规则和通过插粧得到第二步中提出 的记录元素,将各个规则用元素的形式表示出来,生成流程中原子性违反的判定条件。
[0077] 通过记录的元素先得出异步调用的函数列表asynCallFunList,函数中变量列表 asynCallVarList,异步调用发送数据sendDataList,回调函数CallBackOperList中涉及 html元素的操作callBackldList。然后,再根据相应的规则,设计原子性违反的判定条件:
[0078] 本发明选用pageElements :attr中的id来表示事件源:
[0079] 判定条件1 :判定此次调用是否已发生:
[0080] attr. id. asynCallList. isContain(asynCall);
[0081] 判定条件2 :判定回调函数是否涉及其它HTML元素:
[0082] attr. id. callBackOperList. isContain (attr. id);
[0083] 判定条件3 :判定调用发送数据是否包含其它调用的返回数据:
[0084] attr. id. sendDataList. isContain (attr. id. callBackldList. id);
[0085] 判定条件4 :判定调用是否包含某一注册事件:
[0086] attr. id. asynCallFunList. islnterffith(registerFun);
[0087] 判定条件5 :判定某个调用函数是否与其它调用的回调函数有交叉操作:
[0088] attr. id. asynCallFunList. islnterffith(callBackOperList)〇
[0089] 第五步:由于第四步中得出的规则建立在整个抽象化操作的基础上,规则的描述 仅代表流程中各个模块间操作需要保持的原子性和一致性,但难以人工地用这些规则来判 定操作的原子性。操作抽象化后,展现出来的仅仅只有流程执行的状态和路径,具体执行细 节无法得到。因此,具体操作的判定需要通过插粧得到,并根据第二步中提出的各个模块消 息来设计。
[0090] 依据得到的原子性违反判定条件,编写对应的动态分析脚本,将脚本集成到工具 Jalangi上,运行Jalangi,得出整个Web应用请求-回应流程的原子性违反检测结果。
[0091] Jalangi 动态分析脚本格式:J$. analysis ={}; (function (sandbox) {具体脚本 内容}) (J$);
[0092] 具体脚本内容包括:传递参数、返回值、判定函数。传递参数是pageElements和 JSElements ;返回值是检测结果result (true/false)和错误类型errNum ;判定函数对应 的各个判定条件,如 if (attr. id. asynCallList. isContain (asynCall)) {result = false ; errNum = I ;} 〇
[0093] 上述方法不仅可以通过算法自动化实现检测,而且能够保证模块间操作原子性违 反的检测,使得整个流程得以顺利、高效地执行。
[0094] 下面结合Web应用中广泛使用的用户注册表单提交过程对本发明作具体实施说 明。表单操作流程如图3所示。本发明不仅限适用于该例。
[0095] 注册表单的提交是网站中普遍涉及的Web应用,基本的操作过程包括:用户进入 网站后点击注册
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1