调用addJSONData时不使用jqGrid autoencode = true

时间:2012-04-04 13:57:58

标签: jquery json jqgrid

如果我从服务器返回包含javascript的JSON并通过addJSONData将其填充到jqGrid,那么即使我在选项中有autoencode = true也会执行它。为了防止XSS,我必须以这种方式修改jqGrid的addCell函数

        var v,prp;
        // This if block has been added
        if(ts.p.autoencode) {
            cell = $.jgrid.htmlEncode(cell);
        }
        v = formatter(rowId,cell,pos,srvr,'add');
        prp = formatCol( pos,irow, v, srvr, rowId, true);
        return "<td role=\"gridcell\" "+prp+">"+v+"</td>";

这是防止XSS的正确方法还是在jqGrid中还有其他方法可以做到这一点?

3 个答案:

答案 0 :(得分:1)

很抱歉,但我不明白javascript是如何在JSON内部而不是HTML(请参阅“我返回包含javascript的JSON”)。你能描述一下你的Cross-Site-Scripting攻击场景更详细或更好地提供相应的演示吗?

我个人不明白你为什么要使用addJSONData。我在stackoverflow上的第一篇帖子here中的帖子是关于这个主题的。不过,如果您使用autoencode: true选项,我认为数据将被编码。如果您查看addJSONData的代码,您会发现the line

rowData.push( addCell(idr,v,j+gi+si+ni,i+rcnt,cur) );

使用addCell将单元格内容添加到网格中。内部函数addCell调用formatter,默认情况下调用cellVal

v = cellVal(cellval);

并且cellVal(val)返回

$.jgrid.htmlEncode(val)

对于val的任何非空autoencode: true

如果您确实发现代码中存在某些问题或某些错误,最好发布可用于重现该错误的演示。

答案 1 :(得分:0)

在我们的应用程序中,用户输入按原样保存并返回给UI,负责对其进行编码。

以下是从包含javascript的服务器返回的示例JSON数据

{"page":1,"total":1,"records":1,"rows":[{"id":"1","cell":["10jcmjn30jjiej8l499p","NO_ALERTS:Ei hälytyksiä","<script>console.log('jep');</script>","Pentti P.","3.4.2012 15:47","Kaupunki","Teiden auraus, KLO","Muu, Moite, Kiitos","Käsittelyssä, Odottaa vastausta","Ei määritetty","Luottamuksellinen","-","0","Kirjattu","x"]}]}

我已经花了很多时间在我们的应用程序中使jqGrid工作得非常好(感谢伟大的软件)并且使用了addJSONData,因此我不会在不需要的情况下更改它。

问题 - 格式化程序

} else if($.fmatter){
始终会调用

。在我的javascript知识中,$ .fmatter始终为true,因此不会调用最后的其他内容。实际上,这个bug似乎是在jqGrid的Formatter模块中而不是在基本模块中。

$。fn.fmatter不进行任何编码。在我的情况下,它永远不会去

if ($.fn.fmatter[formatType]){

阻止但它总是按原样返回给定的cellval。也许这是编码的正确位置?

这就是我在我们的应用程序中完成这项工作所做的工作

$.fn.fmatter = function(formatType, cellval, opts, rwd, act) {
        // build main options before element iteration
        var v=cellval;
        opts = $.extend({}, $.jgrid.formatter, opts);

        if ($.fn.fmatter[formatType]){
            v = $.fn.fmatter[formatType](cellval, opts, rwd, act);
        } else {
            v = $.jgrid.htmlEncode(cellval);
        }

        return v;
    };

答案 2 :(得分:0)

我发现有一个XSS漏洞(至少在jqGrid 4.5.4中,可能是更新的版本?),因为行的id属性是由AJAX调用返回的数据设置的{{3} }。问题来自constructTr未清理id参数*,然后进入rowData,后者会附加到addJSONData函数中的DOM元素。

不幸的是constructTr由于其范围而无法轻松修补,但您可以修补getAccessor函数,该函数通常会将ID提供给constructTr

(function(jgrid){
    var _getAccessor = jgrid.getAccessor;
    function htmlAttributeEncode (value) {
        /* your encoding function here */
        return encodedValue;
    }
    jgrid.getAccessor = function () {
        return htmlAttributeEncode(_getAccessor.apply(jgrid, arguments));
    };
})(jQuery.jgrid);

(尚未测试过那种确切的解决方案,但这类似的应该有效。)

* 注意:其他属性也没有清理,但我不确定它们是否可以包含来自AJAX调用的原始数据。值得研究更多。