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 が HTML ではなく JSON 内にある方法がわかりません (「javascript を含む JSON を返す」を参照してください)。クロスサイト スクリプティング攻撃のシナリオをより詳細に説明するか、対応するデモをより適切に提供していただけますか?

個人的には、なぜあなたが使用するのかまったくわかりませんaddJSONDataここでのスタックオーバーフローの最初の投稿からの私のものは、主題に関するものでした。それにもかかわらず、オプションを使用すると、データはエンコードされると思い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

idAJAX呼び出しから返されたデータによって設定された行の属性が適切に消去されていないため(OWASP XSSルール2に従って)、XSSの欠陥があることがわかりました(少なくともjqGrid 4.5.4では、おそらく新しいバージョンですか? ) 。問題は、パラメータ*をconstructTrサニタイズしないことから発生します。これは、関数内のDOM要素に追加されます。idrowDataaddJSONData

残念ながら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 に答える
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 をアプリケーションで実際にうまく機能させるために多くの時間を費やしました (素晴らしいソフトウェアに感謝します)。

問題へ - フォーマッタで

} 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 に答える