主页 > 网络知识 > 由Google Voice插件触发的DOM(2)

由Google Voice插件触发的DOM(2)

                        v(null != h && null != k, "goog.dom.insertSiblingAfter expects non-null arguments");

 

                        k.parentNode && k.parentNode.insertBefore(h,

 

                            k.nextSibling);

 

                        Vc(a)

 

                    }

 

                    var t = Ic(document, g);

 

                    t && (Ug++, nc(t, "click", ma(Sg, t, f)))

 

                }

 

            } catch (E) {}

 

        }

 

    }

 

}

上述代码理解起来不难,开发者试图从元素内容中查找抓取用户电话号码,然后使用抓取的电话号码作为其内容来创建另一个span元素,以便用户可以直接从网页中点击并实施呼叫操作。

仔细分解开来,在代码的第1行到第9行,用到了document.evaluate方法遍历元素内容,它可以在HTML和XML文档中进行搜索,并返回代表结果的实体XPathResult。也就是说,函数Wg()就是负责抓取元素内容的,它会把所有的文本结点赋值给变量 ‘a’,以此作为源进行后续处理查找,而以下代码就是导致DOM XPath注入的原因:

(var b = /(^|s)((+1d{10})|((+1[ .])?(?d{3})?[ -./]{1,3}d{3}[ -.]{1,2}d{4}))(s|$)/m, c = document.evaluate('.//text()[normalize-space(.) != ""]', a, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null), d = 0; d < c.snapshotLength; d++) {

 

        a = c.snapshotItem(d);

在上述代码之后,当函数Wg()继续执行搜索时,变量’b'会以正则方式在变量’a'中去匹配美国电话号码,如果有匹配结果,则赋值给变量 ‘f’,接下来,把它定义为变量’h'中的内容。

代码第10和11行主要是检查变量’f'中的HTML元素标记,它既不是形如SCRIPT, STYLE, HEAD, OBJECT, TEXTAREA, INPUT, SELECT, 或A这样的标记,也不是带有”gc-cs-link”的类属性名,它执行的检查目的在于:

1、防止插件与DOM混淆,因为它不想调用诸如SCRIPT、STYLE和HEAD之类的元素上的内容,也不希望用INPUT、SELECT等操作;

2、如果已经抓取到了电话号码,就停止代码,防止继续遍历循环。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!