javascript - 如何将白色列表传递给 caja web 独立脚本

标签 javascript google-caja

我正在使用http://caja.appspot.com/html-css-sanitizer-minified.js清理用户 html,但在某些情况下,我想将使用的标签限制为白名单。

我找到了https://code.google.com/p/google-caja/wiki/CajaWhitelists它描述了如何定义白名单,但我不知道如何将其传递给 html-css-sanitizer-minified.js 提供的 html_sanitize 方法

我尝试调用 html.sanitizeWithPolicy(the_html, White_list);但我收到错误:

TypeError: a is not a function

由于缩小,这很难调试,但 html-css-sanitizer-minified.js 似乎并不包含 html-sanitizer.js 文件中的所有内容。

我尝试过将 html-sanitizer.js 与 cssparser.js 结合使用,而不是缩小版本,但在调用它之前出现错误,大概是因为我缺少其他依赖项。

我怎样才能做到这一点?

编辑:sanitizeWithPolicy 确实存在于缩小文件中,但在该过程中缺少一些内容。这表明该文件不能与自定义白名单一起使用。我现在正在调查是否有可能找出我需要包含哪些未缩小的文件来制作我自己的版本。

编辑2:我丢失了两个文件https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/html4-defs.js?spec=svn1950&r=1950https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/uri.js?r=5170

但是我现在收到错误,因为 sanitizeWithPolicy 需要一个函数而不是白名单对象。此外,html4-defs.js 文件非常旧,根据 this我必须构建 caja 项目才能获得更新的项目。

最佳答案

我通过下载未缩小的文件解决了这个问题

https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/html-sanitizer.js

https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/uri.js

https://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/html4-defs.js?spec=svn1950&r=1950 (最后一个来自旧版本。此文件是根据 Java 文件构建的,如果有更新的文件可用,那就太好了。)

然后我向 html-sanitizer.js 添加了一个新函数

/**
* Trims down the element white list to just those passed in whilst still not allowing unsafe elements.
* @param {array} custom_elements An array of elements to include.
*/
function useCustomElements(custom_elements) {
  var length = custom_elements.length;
  var new_elements = {};
  for (var i = 0; i < length; i++) {
      var key = custom_elements[i].toLowerCase();
      if (typeof elements.ELEMENTS[key] !== 'undefined') {
          new_elements[key] = elements.ELEMENTS[key];
      }
  }
  elements.ELEMENTS = new_elements;
};

然后,我在文件末尾附近将此函数与其他公共(public)函数语句一起公开。

html.useCustomElements = html['useCustomElements'] = useCustomElements;

现在我可以这样调用它:

var raw = '<p>This element is kept</p><div>this element is not</div>';
var white_list ['p', 'b'];
html.useCustomElements(white_list)
var sanitized = html.sanitize(raw);

然后,我手动将一些 html5 元素添加到 html4-defs.js 文件中(仅定义 block 元素,如 和 )。

属性清理仍然被破坏。这是由于 html4-defs.js 文件与 html-sanitizer.js 相比已经过时。我在 html-sanitizer.js 中更改了此设置:

if ((attribKey = tagName + '::' + attribName,
     elements.ATTRIBS.hasOwnProperty(attribKey)) ||
    (attribKey = '*::' + attribName,
     elements.ATTRIBS.hasOwnProperty(attribKey))) {
  atype = elements.ATTRIBS[attribKey];
}

if (elements.ATTRIBS.hasOwnProperty(attribName)) {
  atype = elements.ATTRIBS[attribName];
}

这远非理想,但如果不编译 Caja 并生成最新的 html-defs.js 文件,我看不到解决这个问题的方法。

这仍然需要对 css 进行清理。我也想要这个,但我缺少 css def 文件,并且无法通过搜索找到任何可用的文件,因此我暂时将其关闭。

编辑:我已成功从 html-css-sanitizer-minified.js 中提取 html-defs。 我已将副本上传至here 。它包含“nav”等元素,因此已针对 html5 进行了更新。

我尝试对 css 解析做同样的事情,我设法提取了 def,但它们依赖于位计数,而且我无论如何也找不到来计算哪些位用于哪些默认值。

关于javascript - 如何将白色列表传递给 caja web 独立脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26340730/

相关文章:

javascript - 有什么方法可以创建 "state"监听器而不是 "event"监听器?

javascript - 为什么当我console.log(event) for `from` onSubmit时,我没有看到preventDefault方法

google-apps-script - 使用 HTMLService 创建的密码输入字段丢失 type=password

jquery - 如何使用 htmlService 定位 jQuery 对话框

google-apps-script - 如何让 Caja 在脚本标签中保留模板文本?

java - 无法运行 java 程序! NoClassDefFoundError?

javascript - 在这种情况下 IF 条件始终为假

javascript - 如何制作单个子 div 滚动条?

javascript - document.write 错误?

java - 如何在 Java 中使用 Google Caja HTML/CSS sanitizer JS 库