如果我从服务器返回包含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中还有其他方法可以做到这一点?
答案 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调用的原始数据。值得研究更多。