2012-04-04 54 views
1

如果我返回一個包含從服務器的JavaScript JSON,並通過addJSONData它來填充的jqGrid會連我都autoencode =期權真正執行不使用。爲了防止XSS我不得不修改jqGrid's addCell功能這樣的jqGrid autoencode = TRUE時addJSONData叫

 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的一些其他的方式來做到這一點?

回答

1

很抱歉,但我不明白的javascript怎麼能JSON的,而不是HTML裏面(見「我會返回一個包含JavaScript的JSON」)。你能描述一下你的跨站腳本攻擊的場景嗎?更詳細的還是更好的提供相應的演示?

我個人不明白爲什麼你用addJSONData可言。我的第一個帖子here在stackoverflow是關於這個問題。不過,如果您使用autoencode: true選項,我認爲數據將被編碼。如果你看看addJSONData的代碼,你會發現the line

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

其使用addCell添加單元格內容到電網。內部函數調用addCellformatter它調用cellVal每默認

v = cellVal(cellval); 

cellVal(val)返回

$.jgrid.htmlEncode(val) 

對於任何非空valautoencode: true情況。

如果你看到一些問題,或者在代碼中的一些bug,你應該更好地後可用於重現bug演示。

0

在我們的應用程序的用戶輸入,保存爲是,並返回到UI,其職責是編碼。

這裏的例子從服務器返回的JSON數據包含的JavaScript

{"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總是如此,所以最後的其他部分永遠不會被調用。實際上,這個bug似乎在jqGrid的格式化模塊中不在基本模塊中。

$ .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; 
    }; 
0

由於該行的id我發現有一個跨站腳本漏洞(至少在jqGrid的4.5.4,也許新版本?)屬性由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調用的原始數據。值得追查更多。