caja 原理 : 前端

    作为前端开放的基础安全保证,caja 是目前比较合适的运行机制,包括前端运行环境以及后端编译环境,这次先整体介绍下 caja 在前端是如何屏蔽外部模块代码对整体应用的影响 (注意:官方文档较少,以下为自己理解,难免偏颇).

组成部分

1. 整体运行环境:隔离模块与宿主环境,并提供外部应用与模块的沟通机制.

 

2. 提供 ecmascript5 以及 dom2 的全平台兼容实现,注入到运行环境中。

 

     es5 部分通过直接修改本地原生对象原型实现,运行时直接使用原生对象,这种做法值得推荐

 

      其中比较重要的是:模拟实现 es5 中的属性描述符 ,结合后端编译,用户的所有读写操作都会经过 caja 前端运行环境监测,是 caja 安全保证的核心机制.

 

     dom 兼容部分则并不是直接修改宿主 dom 原型 ,而是自行构造了一系列 javascript 实现的 dom 类,使用组合模式,将操作增强并委托到对应的原生节点,然后将这些 dom 类注入到模块运行环境。用户程序对 dom 节点的操作都要经过 caja 运行环境的转发,便于控制。

 

3. html/css parser ,包含了简易的 html/css parser,对用户的 html,css进行必要的过滤以及添加自定义规则,最常见的是

 

 1. 防止 id 冲突,经过过滤后,每个 id 都改写为全局唯一的标志.

 

 2. 拦截随意跳转,监控代码的可能跳出点( src , href ...).

 

 3. 代码模块化机制,后端将用户代码编译为模块化单元,前端通过模块化机制加载并初始化用户代码。实现代码广泛采用了 promise .

运行机制

caja 中的每个模块表示为一段 html,css,javascript 的结合体,外部应用嵌入多个模块,caja 保证每个模块的独立性与安全性:

 

1.不能访问平台的相关特性.(window.location,cookie )

2.不能污染全局。( 全局变量,原生对象,宿主对象 )

3.节点操作限于模块内部.

转自 { focus : web }

posted @ 2015-12-07 22:13  kailzhou  阅读(1871)  评论(0编辑  收藏  举报