2012-04-04 1 views
1

サーバーからのjavascriptを含むJSONを返し、addJSONDataを使用してjqGridに移入すると、オプションでautoencode = trueの場合でも実行されます。私はこのよう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>"; 

jqGrid's addCell機能を変更する必要がありましたXSSを防ぐためには、これは、XSSを防ぐための正しい方法ですかこれを行うにjqGridで他のいくつかの方法がありますか?

答えて

1

申し訳ありませんが、javascriptがHTMLではなくJSONの内部にある方法はわかりません(「javascriptを含むJSONを返します」を参照)。クロスサイトスクリプティング攻撃のシナリオをより詳細に、またはより適切に対応するデモを提供することができますか?

私は個人的になぜaddJSONDataを使用するのかわかりません。最初の記事hereから私の1つは、stackoverflow上の件でした。それにもかかわらず、私はあなたがautoencode: trueオプションを使用すると、データがエンコードされると思います。あなたがaddJSONDataのコードを見れば、あなたはグリッドにセルの内容を追加してaddCellを使うthe line

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

があります。 cellVal

デフォルト当たり
v = cellVal(cellval); 

を呼び出し、cellVal(val)戻るautoencode: trueの場合には空でないvalため

$.jgrid.htmlEncode(val) 

formatterを呼び出すaddCell内部機能。

コードに何らかの問題やバグがある場合は、そのバグを再現するためのデモを投稿してください。

0

私たちのアプリケーションでは、ユーザーの入力はそのまま保存され、UIに返され、その責任はエンコードされます。

は、ここで私は我々のアプリケーションでは、実際に非常によく(ソフトウェアの素晴らしい作品に感謝を)jqGrid仕事をするために多くの時間を使用しているとaddJSONDataがされている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"]}]} 

が含まれているJSONデータをサーバから返された例です私はそれを行う必要なしにそれを変更しないように使用されます。問題の

- フォーマッタ

} else if($.fmatter){ 

では常に呼ばれています。私のjavascriptの知識では$ .fmatterは常に真ですので、最後の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; 
    }; 
0

でこの仕事をするために何をしたかXSSの脆弱性が存在し、私を発見したされた(少なくともjqGrid 4.5.4で、多分新しいバージョンは?)による行のidへ属性はappropriately cleaned (as per OWASP XSS rule 2)ではないAJAX呼び出しから返されたデータによって設定されます。問題はconstructTridパラメータ*をサニタイズしないことから来て、に入り、addJSONData関数のDOM要素に追加されます。

残念なことにconstructTrは範囲のために簡単には修正できませんが、通常constructTrにIDを供給するgetAccessor関数にパッチを当てることができます。

(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呼び出しからの生データ。もっと調査する価値がある。

関連する問題