1

ajaxでcsrfを使用してCodeigniterでfileuploader.jsを使用するにはどうすればよいですか?

images_crud ライブラリhttp://www.web-and-development.com/image-crud-an-automatic-multiple-image-uploader-for-codeigniter/を使用しています

私は得続けます

The action you have requested is not allowed.

追加した..

createコントローラーにメソッドを追加しました:

/**
 * pages form
 */
public function create(){

    if(!isset($this->data['output'])){
        $this->data = array_merge($this->data, 
                        array(  'output'    => '' , 
                                'js_files'  => array() , 
                                'css_files' => array()
                            )
                        );
    }


    //-------------------------
    //for file uploading
    $image_crud = new image_CRUD();

    $image_crud->set_primary_key_field('id');
    $image_crud->set_url_field('filename');
    $image_crud->set_table('news')
        ->set_image_path('public/documents');

    $output = $image_crud->render();

    $this->data['output']=$output->output;
    $this->data['js_files']=$output->js_files;
    $this->data['css_files']=$output->css_files;
    //-------------------------


    //display
    $this->load->view('templates/admin_header');
    $this->load->view('admin/index.php');
    $this->load->view('admin/create_pages.php', $this->data);
    $this->load->view('templates/admin_footer');
}

そして、create_pagesビュー内:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?>
<?php echo validation_errors()?>

<?php 
foreach($css_files as $file): ?>
<link type="text/css" rel="stylesheet" href="<?php echo $file; ?>" />
<?php endforeach; ?>
<?php foreach($js_files as $file): ?>
<script src="<?php echo $file; ?>"></script>
<?php endforeach; ?>

<?php echo form_open(site_url('admin/pages/save'),array('style'=>'width:700px;'))?>

<label>
    Title
    <input type='text' name='title' value='<?php echo @$title?>' />
</label>
<br/>

content :
<textarea name="content" id="content" >
    <?php echo @$content?>
</textarea>
<br/>

<?php echo $output?>

<input type='submit' name='submit' value='save' />
</form>

ライブラリに と を追加image_crud.phpimage_moo.phpました。

500 Internal Server ErrorURL が http://example.com/mole/pages/create/upload_file?qqfile=1355936206.9151.jpgになっています。

http://example.com/mole/admin/pages/create/upload_file?qqfile=1355936206.9151.jpgになりたかった

fileuploader.jsがアップロード用に別の URL を使用している理由がわかりません。

追加した

まあ、私はhttp://www.web-and-development.com/image-crud-an-automatic-multiple-image-uploader-for-codeigniter/から入手できるコーディングにあまり変更を加えていません

$(function(){
<?php if ( ! $unset_upload) {?>
    createUploader();
<?php }?>
    loadColorbox();
});
function loadColorbox()
{
$('.color-box').colorbox({
    rel: 'color-box'
});
}
function loadPhotoGallery(){
$.ajax({
    url: '<?php echo $ajax_list_url?>',
    dataType: 'text',
    data:$('input[type=hidden]').eq(1).prop('name')+':'+$('input[type=hidden]').eq(1).prop('value'),
    beforeSend: function()
    {
        $('.file-upload-messages-container:first').show();
        $('.file-upload-message').html("<?php echo $this->l('loading');?>");
    },
    complete: function()
    {
        $('.file-upload-messages-container').hide();
        $('.file-upload-message').html('');
    },
    success: function(data){
        $('#ajax-list').html(data);
        loadColorbox();
    }
});
}
function createUploader(){
        var uploader = new qq.FileUploader({
            element: document.getElementById('file-uploader-demo1'),
            template: '<div class="qq-uploader">' +
                '<div class="qq-upload-drop-area"><span><?php echo $this->l("upload-drop-area");?></span></div>' +
                '<div class="qq-upload-button"><?php echo $this->l("upload_button");?></div>' +
                '<ul class="qq-upload-list"></ul>' +
                '</div>',
            fileTemplate: '<li>' +
                '<span class="qq-upload-file"></span>' +
                '<span class="qq-upload-spinner"></span>' +
                '<span class="qq-upload-size"></span>' +
                '<a class="qq-upload-cancel" href="#"><?php echo $this->l("upload-cancel");?></a>' +
                '<span class="qq-upload-failed-text"><?php echo $this->l("upload-failed");?></span>' +
                '</li>',
            action: '<?php echo $upload_url?>',
            debug: true,
            onComplete: function(id, fileName, responseJSON){
                loadPhotoGallery();
            }
        });
}
function saveTitle(data_id, data_title)
{
    $.ajax({
        url: '<?php echo $insert_title_url; ?>',
        type: 'post',
        data: {primary_key: data_id, value: data_title},
        beforeSend: function()
        {
            $('.file-upload-messages-container:first').show();
            $('.file-upload-message').html("<?php echo $this->l('saving_title');?>");
        },
        complete: function()
        {
            $('.file-upload-messages-container').hide();
            $('.file-upload-message').html('');
        }
        });
}
4

2 に答える 2

1

ここでは2つの問題があります。

まず、すべてのajaxリクエストでcsrfトークンを設定する必要があります。これは簡単です。

次に、アップロード時にcsrfトークンを設定する必要があります。これは不可能です。

ただし、ここに他の選択肢があることを確認してください。心配するな!

タイトルの編集や削除などの各方法。次のように解決できます。

list.php最初にあなたの中で:

    $this->set_css('assets/image_crud/css/fileuploader.css');
    $this->set_css('assets/image_crud/css/photogallery.css');
    $this->set_css('assets/image_crud/css/colorbox.css');

    $this->set_js('assets/image_crud/js/jquery-1.8.2.min.js');
    $this->set_js('assets/image_crud/js/jquery-ui-1.9.0.custom.min.js');
    $this->set_js('assets/image_crud/js/fileuploader.js');
    $this->set_js('assets/image_crud/js/jquery.colorbox-min.js');
    $CI =& get_instance(); // create codeigniter reference instance.

それで:

function saveTitle(data_id, data_title)
{
        $.ajax({
            url: '<?php echo $insert_title_url; ?>',
            type: 'post',
            data: {primary_key: data_id, value: data_title,
            '<?php echo $CI->security->get_csrf_token_name(); ?>':'<?php echo $CI->security->get_csrf_hash(); ?>'},
            beforeSend: function()
            {
                $('.file-upload-messages-container:first').show();
                $('.file-upload-message').html("<?php echo $this->l('saving_title');?>");
            },
            complete: function()
            {
                $('.file-upload-messages-container').hide();
                $('.file-upload-message').html('');
            }
            });
}

簡単な解決策。csrf_token_nameとを追加するだけcsrf_hash_valueです。

2番目の問題については、 qq.fileuploader$_GETがではなくを 使用するため不可能であると述べたため、それらが提供$_POSTするプロパティは、 csrf_verify()メソッド によって解析されないget引数をparams追加するだけです。それを解決する方法:あなたのところに行き、その最後に次のコードを追加するだけです:config/config.php

if(stripos($_SERVER["REQUEST_URI"],'/upload_file') === FALSE)
{
    $config['csrf_protection'] = TRUE;
}
else
{
    $config['csrf_protection'] = FALSE;
} 

これにより、アップロードのcsrfチェックが無効になり(アップロード時に無効になります)、次のリクエストで再度有効になります。

私はこのコードをテストしましたが、100%機能しています。:)

更新:主な問題は、image_crudの開発者がマルチパートエンコードされたリクエストを考慮していないことです(新しい結果からわかるように)。彼は古いバージョンのfineuploaderを使用しています。この問題はfineuploader3.0+で解決されてますが、マルチパートエンコードされたリクエストを使用するときに問題が発生しているimage_crudではまだ解決されていません。

私が助けてくれたことを願っています。

于 2013-01-13T02:04:34.873 に答える
0

image_crud の作成者は、Fine Uploader の最新バージョンを利用する新しいバージョンを公開しました。IE の問題やその他の問題は、最新バージョンで修正する必要があります。最小限の再構成なしで、csrf トークンを利用できるようになるはずです。

于 2013-01-27T15:03:48.653 に答える