【问题标题】:jqGrid autoencode=true not used when addJSONData is called调用 addJSONData 时不使用 jqGrid autoencode=true
【发布时间】:2012-04-04 13:57:58
【问题描述】:

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

【问题讨论】:

    标签: jquery json jqgrid


    【解决方案1】:

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

    我个人完全不明白你为什么使用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

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

    【讨论】:

      【解决方案2】:

      在我们的应用程序中,用户输入按原样保存并返回到负责对其进行编码的 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]){
      

      block 但它总是按原样返回给定的 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;
          };
      

      【讨论】:

        【解决方案3】:

        我发现存在 XSS 缺陷(至少在 jqGrid 4.5.4 中,可能是更新的版本?),因为行的 id 属性是由 AJAX 调用返回的数据设置的,而不是 appropriately cleaned (as per OWASP XSS rule 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 调用的原始数据。值得进一步研究。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-11
          • 2011-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多