0

Codeigniter と jqgrid を使用してアプリケーションを構築しています。最近、セキュリティ上の理由から Codeigniter の組み込みの CSRF 保護を有効にしましたが、jqgrid でいくつかの問題が発生しました。jqgrid がインスタンス化されたときに csrf トークンを渡すことができたので、(csrf トークンを postData に追加することによって) すべてのデータが読み込まれますが、セルを編集するたびに 500 エラーが発生します。合格した。これは、セルを編集するたびに投稿データを確認することで確認できます。editData が必要な場所をいくつか読みましたが、そこにトークンを追加しても、編集 ajax リクエストで渡されないようです。何か案は?

$("#cust_grid").jqGrid({
    url:'/ajax/grid',
    datatype: 'xml',
    mtype: 'POST',              
    postData: {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'"; ?>},
    editData: {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'"; ?>},
    colNames:['Name1', 'Name2'],
    colModel :[ 
        {name:'name1', index:'name1', width:55, search: true},
        {name:'name2', index:'name2', width:110, search: true},
                        ],
    pager: '#pager',
    rowNum:25,
    rowList:[10,25,50,100],
    sortname: 'name1',
    sortorder: 'asc',
    viewrecords: true,
    gridview: true,
    caption: 'Customers',
    height: 600,
    width: 1200,
    shrinkToFit: false,
    altRows: true,
    cellEdit: true,     
    cellsubmit: "remote",
    cellurl: "/ajax/editCell",
},
{}
);
4

3 に答える 3

0

ここで説明したのとほぼ同じ方法で問題を解決できるようです。主な違いは、フォーム編集ではなくセル編集を使用することです。したがって、代わりに次を使用する必要があります。ajaxCellOptionsajaxEditOptions

ajaxCellOptions: {
    loadBeforeSend: function(jqXHR) {
        // you should modify the next line to get the CSRF tocken
        // in any way (for example $('meta[name=csrf]').attr('content')
        // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>)
        var csrf_token = '<%= token_value %>'; // any way to get
        jqXHR.setRequestHeader('X-CSRF-Token', csrf_token);
    }
}
于 2012-09-08T12:40:22.363 に答える
0

私は結局、問題に対する別の解決策を見つけました。別の回答に投稿されたセル編集リンクを調査していたところ、 beforeSubmitCell オプションが表示されました。その関数からjsonデータを返すと、セルが編集されるたびに投稿データに追加されます。だから私がする必要があったのは、オプションとして追加することだけでした:

beforeSubmitCell: function (rowid,celname,value,iRow,iCol) {
  return {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'";?>} 
},
于 2012-09-10T22:54:35.577 に答える