1

如果我从服务器返回包含 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 中有其他方法可以做到这一点?

4

3 回答 3

1

抱歉,但我不明白 javascript 如何在 JSON 而不是 HTML 内部(请参阅“我返回包含 javascript 的 JSON”)。您能否更详细地描述您的跨站点脚本攻击场景或更好地提供相应的演示?

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

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

用于addCell将单元格内容添加到网格中。内部函数addCell调用格式化程序,默认情况下调用cellVal

v = cellVal(cellval);

cellVal(val)回报

$.jgrid.htmlEncode(val)

对于任何非空val的情况autoencode: true

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

于 2012-04-04T14:28:11.893 回答
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,因此永远不会调用最后一个 else。实际上,该错误似乎在 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;
    };
于 2012-04-05T06:51:48.747 回答
0

我发现存在 XSS 缺陷(至少在 jqGrid 4.5.4 中,可能是较新的版本?),因为行的id属性是由未适当清理的 AJAX 调用返回的数据设置的(根据 OWASP XSS 规则 2)。问题来自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 调用的原始数据。值得进一步研究。

于 2016-12-19T22:28:26.353 回答