Codeigniter CSRF 仅对一次 ajax 请求有效

新手上路,请多包涵

我想在 jQuery 更改事件时在服务器上上传图像,但是使用 codeigniter csrf 我只能上传一次图像。如何使用ajax为多个请求上传图片。设置时请记住

config['csrf_protection'] = FALSE;

然后我可以发送多个请求 jQuery onchange 事件但是当 csrf_protection 为假时我认为 csrf 没有优势。所以问题是如何在启用 csrf_protection 的情况下使用 ajax 发送多个请求。我的 jquery 代码如下

$("#avatar").change(function(){
    var link = $("#avatar").val();
    $.ajax({
        url : "<?php echo base_url('main/test'); ?>",
        type: 'post',
        data: {'<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',"id":"hello","link":link},
        success : function(data)
        {
            alert(data);
        }
    });
});

我的控制器:

 public function test()
{
    $config['upload_path'] = './uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = 500;
    $config['max_width'] = 260;
    $config['max_height'] = 260;
    $this->load->library('upload', $config);
    if (!$this->upload->do_upload('link')) {
        echo "error";
    } else {
        $data = array('upload_data' => $this->upload->data());
        $image_name = $data['upload_data']['file_name'];
        echo $image_name;
    }
}

原文由 romio 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 429
2 个回答

在我看来,您应该尝试在每次请求时重新创建您的 csrf 令牌

试试这个代码示例…

对于js函数

var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>',
    csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
("#avatar").change(function(){
    var link = $("#avatar").val();

    var dataJson = { [csrfName]: csrfHash, id: "hello", link: link };

    $.ajax({
        url : "<?php echo base_url('main/test'); ?>",
        type: 'post',
        data: dataJson,
        success : function(data)
        {
            csrfName = data.csrfName;
            csrfHash = data.csrfHash;
            alert(data.message);
        }
    });
});

和控制器

public function test() {
    $config['upload_path'] = './uploads/';
    $config['allowed_types'] = 'gif|jpg|png';
    $config['max_size'] = 500;
    $config['max_width'] = 260;
    $config['max_height'] = 260;

    $reponse = array(
                'csrfName' => $this->security->get_csrf_token_name(),
                'csrfHash' => $this->security->get_csrf_hash()
                )

    $this->load->library('upload', $config);
    if (!$this->upload->do_upload('link')) {
        $reponse['message'] = "error";
    }
    else {
        $data = array('upload_data' => $this->upload->data());
        $image_name = $data['upload_data']['file_name'];
        $reponse['message'] = $image_name;
    }

    echo json_encode($reponse);
}

让我知道,祝你好运

注意: 当有人要求您向问题发布更多数据时,不要将其作为评论或答案发布,最好编辑问题本身并添加内容

原文由 Edu 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以在 config.php 中设置它

$config['csrf_regenerate'] = FALSE;

因此 csrf 保护在整个会话期间都有效,它将解决您的问题。如果您设置 $config['csrf_regenerate'] = true; 那么 CI 会在每次请求时生成新的 csrf 令牌,因此您的旧 csrf 令牌与新生成的 csrf 令牌不匹配

原文由 Eloise85 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏