web-dev-qa-db-fra.com

Codeigniter CSRF valide pour une seule requête ajax

Je souhaite télécharger une image sur le serveur lors d'un événement jQuery mais en utilisant codeigniter csrf, je ne peux télécharger une image qu'une seule fois. Comment puis-je télécharger des images en utilisant ajax pour plusieurs requêtes.S'il vous plaît garder à l'esprit lorsque je configure cette

config['csrf_protection'] = FALSE;

je peux alors envoyer plusieurs requêtes à un événement jQuery onchange mais lorsque csrf_protection est fausse, je pense que csrf ne présente aucun avantage. la question est donc de savoir comment puis-je envoyer plusieurs requêtes en utilisant ajax lorsque csrf_protection est activé. Mon code jQuery suit

$("#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);
        }  
    });
});
7
romio

A mon avis, vous devriez essayer de recréer votre jeton CSRF à chaque demande.

Essayez cet exemple de code ...

Pour le funcion 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();

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

et pour le contrôleur

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);
}

Faites le moi savoir et bonne chance

Remarque: Lorsque quelqu'un vous demande de poster plus de données dans la question, ne le postez pas sous forme de commentaire ou de réponse, il est préférable de modifier la question elle-même et d'ajouter le contenu

10
Edu

Vous pouvez définir ceci dans config.php 

$config['csrf_regenerate'] = FALSE;

la protection csrf est donc valide pendant tout le temps de session, elle résoudra votre problème . Si vous définissez $config['csrf_regenerate'] = true;, alors CI générera un nouveau jeton csrf à chaque demande afin que votre ancien jeton csrf ne corresponde pas au nouveau 

4
Brian85

Il vous suffit de recharger le jeton CSRF dans notre réponse AJAX. C'est si simple!

1
Brian85

ajoutez ceci à un fichier js qui est chargé à chaque page (je le mets à la fin de jquery.js)

    $.ajaxSetup({
        beforeSend:function(jqXHR, Obj){
            var value = "; " + document.cookie;
            var parts = value.split("; csrf_cookie_name=");
            if(parts.length == 2)   
            Obj.data += '&csrf_token='+parts.pop().split(";").shift();
        }
    });

(notez que dans chaque requête ajax, vous ne pouvez pas envoyer de données vides)

"csrf_cookie_name" en haut défini dans config.php 

$config['csrf_cookie_name'] = 'csrf_cookie_name';
0

S'il vous plaît essayez comme mon code. ça marche mon application

votre fichier de vue

$token_name = $this->security->get_csrf_token_name();
$token_hash = $this->security->get_csrf_hash();

<input type="text" id="search-text" name="parent_name" placeholder="Search" value=""  >
<input type="hidden" id="csrf" name="<?php echo $token_name; ?>" value="<?php echo $token_hash; ?>" />

après la méthode post jquery post comme ci-dessous

// Get Keyup 
jQuery( "#search-text").keyup(function() {
    // Get Data 
    var val       = jQuery("#search-text").val();
    var hashValue = jQuery('#csrf').val();

    // Get jquery post for ajax task
    jQuery.post( 
        '<?php echo $base_controler; ?>',
        {val:val,'<?php echo $this->security->get_csrf_token_name(); ?>':hashValue}, 
        function(data)
        { 
            // Get return data to decode
            var obj = jQuery.parseJSON(data);
            // Get csrf new hash value
            var new_hash = obj.csrfHash;
            // Set csrf new hash value update
            jQuery('#csrf').val(new_hash);

        }
    );        

});

veuillez régler votre contrôleur comme ci-dessous

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

par-dessus tout, le code recrée chaque jeton csrf.

0
Md Suzon Mia