我通过下载未缩小的文件解决了这个问题
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;
};
然后,我在文件末尾附近将此函数与其他公共函数语句一起公开。
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 文件中(那些只定义块元素的元素,例如 and )。
属性清理仍然被破坏。这是由于 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。我已将副本上传到此处。它包括像“nav”这样的元素,因此它已针对 html5 进行了更新。
我尝试对 css 解析做同样的事情,我设法提取了 defs,但它们取决于位数,而且我无论如何都找不到计算哪些位用于哪些默认值。