Javascript 如何将whilte列表传递给caja web独立脚本

Javascript 如何将whilte列表传递给caja web独立脚本,javascript,google-caja,Javascript,Google Caja,我正在使用来清理用户html,但是在某些情况下,我希望将使用的标记限制为一个白名单 我已经找到了描述如何定义白名单的方法,但我无法确定如何将其传递给html-css-sanitizer-minified.js提供的html_sanitize方法 我试着调用html.sanitizeWithPolicy(html,白名单);但我有一个错误: TypeError: a is not a function 由于缩小,很难进行调试,但html-css-sanitizer-minified.js似乎不包

我正在使用来清理用户html,但是在某些情况下,我希望将使用的标记限制为一个白名单

我已经找到了描述如何定义白名单的方法,但我无法确定如何将其传递给html-css-sanitizer-minified.js提供的html_sanitize方法

我试着调用html.sanitizeWithPolicy(html,白名单);但我有一个错误:

TypeError: a is not a function
由于缩小,很难进行调试,但html-css-sanitizer-minified.js似乎不包含html-sanitizer.js文件中的所有内容

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

我怎样才能做到这一点

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

编辑2:我丢失了两个文件


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

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

(最后一个版本来自旧版本。此文件是从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;
};
现在我可以这样称呼它:

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);

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

这仍然需要css消毒。我也想这样做,但我丢失了css def文件,无法通过搜索找到任何可以工作的文件,所以我暂时关闭了它

编辑:我已经设法从html-css-sanitizer-minified.js中提取html def。 我已将副本上载到。它包含像“nav”这样的元素,因此它已经针对html5进行了更新


我也尝试过对css解析进行同样的操作,我成功地提取了DEF,但它们取决于位计数,我无法找到计算哪些位用于哪些默认值的方法。

我决定采用另一种方法。我留下了另一个答案,以防我设法找到css定义的位值,因为如果我能让它工作,它会比这个更好

这次我使用了html css sanitizer缩小文件,并向其中注入了一些代码,以便可以修改元素和属性

搜索:

ka=/^(?:https?|mailto)$/i,m={};
并在其后面插入以下内容:

var unmodified_elements = {};
for(var property_name in $.ELEMENTS) {
    unmodified_elements[property_name] = $.ELEMENTS[property_name];
};
var unmodified_attributes = {};
for(var property_name in $.ATTRIBS) {
    unmodified_attributes[property_name] = $.ATTRIBS[property_name];
};

var resetElements = function () {
    $.ELEMENTS = {};
    for(var property_name in unmodified_elements) {
        $.ELEMENTS[property_name] = unmodified_elements[property_name];
    }
    $.f = $.ELEMENTS;
};

var resetAttributes = function () {
    $.ATTRIBS = {};
    for(var property_name in unmodified_attributes) {
        $.ATTRIBS[property_name] = unmodified_attributes[property_name];
    }
    $.m = $.ATTRIBS;
};

var resetWhiteLists = function () {
    resetElements();
    resetAttributes();
};

/**
 * 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.
 */
var applyElementsWhiteList = function(custom_elements) {
    resetElements();
    var length = custom_elements.length;
    var new_elements = {};
    for (var i = 0; i < length; i++) {
        var key = custom_elements[i].toLowerCase();
        if (typeof $.ELEMENTS[key] !== 'undefined') {
            new_elements[key] = $.ELEMENTS[key];
        }
    }
    $.f = new_elements;
    $.ELEMENTS = new_elements;
};

  /**
   * Trims down the attribute white list to just those passed in whilst still not allowing unsafe elements.
   * @param {array} custom_attributes An array of attributes to include.
   */
var applyAttributesWhiteList = function(custom_attributes) {
    resetAttributes();
    var length = custom_attributes.length;
    var new_attributes = {};
    for (var i = 0; i < length; i++) {
        var key = custom_attributes[i].toLowerCase();
        if (typeof $.ATTRIBS[key] !== 'undefined') {
            new_attributes[key] = $.ATTRIBS[key];
        }
    }
    $.m = new_attributes;
    $.ATTRIBS = new_attributes;
};

m.applyElementsWhiteList = applyElementsWhiteList;
m.applyAttributesWhiteList = applyAttributesWhiteList;
m.resetWhiteLists = resetWhiteLists;
var未修改的_元素={};
for(变量属性名称,单位为$.ELEMENTS){
未修改的_元素[属性_名称]=$。元素[属性_名称];
};
var未修改的_属性={};
for(变量属性\名称,单位为$.ATTRIBS){
未修改的属性[属性名称]=$.ATTRIBS[属性名称];
};
var resetElements=函数(){
$.ELEMENTS={};
for(未修改的\u元素中的var属性\u名称){
$.ELEMENTS[property_name]=未修改的_元素[property_name];
}
$.f=$.ELEMENTS;
};
var resetAttributes=函数(){
$.ATTRIBS={};
for(未修改的_属性中的var属性_名称){
$.ATTRIBS[property_name]=未修改的_属性[property_name];
}
$.m=$.ATTRIBS;
};
var resetWhiteLists=函数(){
重置元素();
重置属性();
};
/**
*将元素白名单裁剪为仅传入的元素,同时仍然不允许使用不安全的元素。
*@param{array}custom_elements要包含的元素数组。
*/
var applyElementsWhiteList=函数(自定义元素){
重置元素();
变量长度=自定义元素长度;
var new_elements={};
对于(变量i=0;i
现在,您可以通过以下方式应用白名单:

var raw = "<a>element tags removed</a><p class='class-removed' style='color:black'>the p tag is kept</p>";
var tag_white_list = [
    'p'
];
var attribute_white_list = [
    '*::style'
];
html.applyElementsWhiteList(tag_white_list);
html.applyAttributesWhiteList(attribute_white_list);
var san = html.sanitize(raw);
var raw=“element tags removed

保留p标记

”; var tag_白名单=[ “p” ]; 变量属性\u白色\u列表=[ “*::风格” ]; applyElementsWhiteList(tag_white_list); applyAttributesWhiteList(属性白名单); var san=html.sanitize(原始);
这种方法还对我需要的样式进行了sanatize。另一个白名单可以为这些注入,但我不需要,所以我没有写一个

ka=/^(?:https?|mailto)$/i,m={};
var unmodified_elements = {};
for(var property_name in $.ELEMENTS) {
    unmodified_elements[property_name] = $.ELEMENTS[property_name];
};
var unmodified_attributes = {};
for(var property_name in $.ATTRIBS) {
    unmodified_attributes[property_name] = $.ATTRIBS[property_name];
};

var resetElements = function () {
    $.ELEMENTS = {};
    for(var property_name in unmodified_elements) {
        $.ELEMENTS[property_name] = unmodified_elements[property_name];
    }
    $.f = $.ELEMENTS;
};

var resetAttributes = function () {
    $.ATTRIBS = {};
    for(var property_name in unmodified_attributes) {
        $.ATTRIBS[property_name] = unmodified_attributes[property_name];
    }
    $.m = $.ATTRIBS;
};

var resetWhiteLists = function () {
    resetElements();
    resetAttributes();
};

/**
 * 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.
 */
var applyElementsWhiteList = function(custom_elements) {
    resetElements();
    var length = custom_elements.length;
    var new_elements = {};
    for (var i = 0; i < length; i++) {
        var key = custom_elements[i].toLowerCase();
        if (typeof $.ELEMENTS[key] !== 'undefined') {
            new_elements[key] = $.ELEMENTS[key];
        }
    }
    $.f = new_elements;
    $.ELEMENTS = new_elements;
};

  /**
   * Trims down the attribute white list to just those passed in whilst still not allowing unsafe elements.
   * @param {array} custom_attributes An array of attributes to include.
   */
var applyAttributesWhiteList = function(custom_attributes) {
    resetAttributes();
    var length = custom_attributes.length;
    var new_attributes = {};
    for (var i = 0; i < length; i++) {
        var key = custom_attributes[i].toLowerCase();
        if (typeof $.ATTRIBS[key] !== 'undefined') {
            new_attributes[key] = $.ATTRIBS[key];
        }
    }
    $.m = new_attributes;
    $.ATTRIBS = new_attributes;
};

m.applyElementsWhiteList = applyElementsWhiteList;
m.applyAttributesWhiteList = applyAttributesWhiteList;
m.resetWhiteLists = resetWhiteLists;
var raw = "<a>element tags removed</a><p class='class-removed' style='color:black'>the p tag is kept</p>";
var tag_white_list = [
    'p'
];
var attribute_white_list = [
    '*::style'
];
html.applyElementsWhiteList(tag_white_list);
html.applyAttributesWhiteList(attribute_white_list);
var san = html.sanitize(raw);