2016-07-21 26 views
5

Ich möchte Bild auf dem Server auf Änderungsereignis von jQuery hochladen, aber mit Codeigniter csrf Ich kann Bild nur einmal hochladen. Wie kann ich Bilder laden Ajax für mehrere requests.Please beachten, wenn ich diesesCodeigniter CSRF nur einmal gültig AJAX-Anfrage

gesetzt
config['csrf_protection'] = FALSE; 

dann mehrere Anfrage jQuery onchange Ereignis senden Ich bin in der Lage, aber wenn csrf_protection falsch sein wird, dann denke ich, es ist kein Vorteil von csrf. Die Frage ist also, wie kann ich mehrere Anfragen mit Ajax senden, während csrf_protection aktiviert ist. Mein jquery Code folgt

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

Könnten Sie den Code des Controllers veröffentlichen, die die Ajax-Request bekommt? – Edu

+0

Öffentlicher Funktionstest() { \t \t $ config ['upload_path'] = './ uploads/'; \t \t $ config ['allowed_types'] = 'gif | jpg | png'; \t \t $ config ['max_size'] = 500; \t \t $ config ['max_width'] = 260; \t \t $ config ['max_height'] = 260; \t \t $ this-> load-> library ('upload', $ config); \t \t wenn (! $ This-> upload-> do_upload ('link')) { echo "fehler"; } sonst { \t \t $ daten = array ('upload_data' => $ this-> upload-> data()); $ image_name = $ daten ['upload_data'] ['file_name']; \t \t echo $ image_name; \t} } – romio

+0

vielen Dank – romio

Antwort

8

Meiner Meinung nach sollten Sie versuchen, Ihre csrf Token jede Anforderung neu

diesen Code Beispiel Versuchen ...

Für die js funcion

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

und für den Controller

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

Lassen Sie uns wissen und viel Glück

Hinweis: Wenn jemand Sie bitten, um weitere Daten zu der Frage veröffentlichen, veröffentlicht es nicht als Kommentar oder Antwort, dann ist es besser, die Frage selbst und das Hinzufügen der Sachen zu bearbeiten

3

können Sie diese in config.php

$config['csrf_regenerate'] = FALSE; 

so die csrf Schutz ist während der gesamten Sitzungszeit gültig es Ihr Problem lösen. Wenn Sie $config['csrf_regenerate'] = true; setzen dann CI neue csrf erzeugen Token jede Anfrage so alten csrf nicht Token mit neuen csrf Token

+0

Ich habe viel gesucht und kann sagen, dass dieser Ansatz nicht empfohlen wird, wird es Verlust der Sicherheit verursachen, gibt es andere Methoden. –

+0

Ich stimme zu Marcelo CSRF-Schutz ist in öffentlichen Web-Apps erforderlich. – Brian85

+0

Ich finde, dass csrf token immer neu zu generieren ist nicht der beste Weg und die Probleme, die es auf mehrere Tabs bringt (Beispiel) kann Ihre App brechen, so gibt es andere Möglichkeiten. Es ist eine Schande, dass CI keine Lösung dafür hat, es macht mich wirklich traurig und ich verlasse den Code-Zünder (aus anderen Gründen auch). –

1

Alles, was Sie tun müssen, erzeugt Match ist der SCRF Token in Ihrer AJAX Antwort neu laden. So einfach ist das!

+0

kannst du mir zeigen, wie das geht? – MZaragoza

+0

Alles, was Sie brauchen, ist, dass die Antwort Ihres AJAX-Controllers im JSON-Format ist und Sie in Ihrem JSON das neue CSRF-Token übergeben können. Ihr Frontend analysiert den JSON und ersetzt den SCRF-Wert in der versteckten Eingabe Ihres Formulars. Ist das klar genug? – Brian85

1

Bearbeiten der config:

$config['csrf_exclude_uris'] = ['controller/method']; 

Array können alle weißen Liste Controller/Methoden schließen Sie die csrf Schutz wollen deaktiviert sein.

Das Array kann auch reguläre Ausdrücke behandeln wie:

$config['csrf_exclude_uris'] = array(
             'api/record/[0-9]+', 
             'api/title/[a-z]+' 
           ); 

Für weitere Informationen besuchen Codeigniter Documentation - Security Class