2017-06-24 7 views
2

Ich versuche, Databases auf meiner Website arbeiten zu lassen. Aber wenn ich auf Suche, nächste Seite, Sortierung klicke, funktioniert es nicht. Dies liegt daran, dass das CSRF-Token nicht neu generiert wird.CSRF-Token auf AjaxPOST aktualisieren Databases: CodeIgniter

Hier ist mein Code:

HTML

<input type="hidden" id="hash" name="csrf_test_name" value="802daa2efaf69edb83b571d7bf7510aa"> 
     <table id="test-table" class="table table-hover"> 
      <thead> 
       <tr> 
        <th>No</th> 
        <th>First Name</th> 
        <th>Last Name</th> 
        <th>Phone</th> 
        <th>Address</th> 
        <th>City</th> 
        <th>Country</th> 
       </tr> 
      </thead> 
      <tbody> 
      </tbody> 

      <tfoot> 
       <tr> 
        <th>No</th> 
        <th>First Name</th> 
        <th>Last Name</th> 
        <th>Phone</th> 
        <th>Address</th> 
        <th>City</th> 
        <th>Country</th> 
       </tr> 
      </tfoot> 
     </table> 

JS

<script type="text/javascript"> 

var table; 

$(document).ready(function() { 

//datatables 
table = $('#test-table').DataTable({ 

    "processing": true, //Feature control the processing indicator. 
    "serverSide": true, //Feature control DataTables' server-side processing mode. 
    "order": [], //Initial no order. 
    "ajax": { 
     "url": "http://oss-dev.forexworld.us/oss/user/ajax_receiving", 
     "type": "POST", 
     data: { 
      'csrf_test_name' : '802daa2efaf69edb83b571d7bf7510aa' 
      }, 
     dataSrc: function (json) { 
      if(json.csrf_test_name !== undefined) $('meta[name=csrf_test_name]').attr("content", json.csrf_token); 
      return json.data; 
     } 
    }, 
    "columnDefs": [ 
    { 
     "targets": [ 0 ], //first column/numbering column 
     "orderable": false, //set not orderable 
    }, 
    ], 

}); 

}); 

</script> 

Ich kann meine Datentabelle Arbeit, indem die $config['csrf_regenerate'] = TRUE; zu FALSCH aber ich ziehe machen‘ Ich will das. Meine Vermutung ist, dass der dataSrc Teil nicht funktioniert, aber ich bin mir nicht sicher.

Sie können es in Aktion sehen here.

Jede Hilfe wird sehr geschätzt. Vielen Dank!

+0

eine schnelle Lösung kann der Ajax-Typ zu GET zu ändern sein. Da CSRF-Tokens auf GET nicht benötigt werden, funktioniert alles wie es ist (obwohl der PHP-Code geändert werden muss, um $ _GET anstelle von $ _POST zu verwenden) – vishwakarma09

Antwort

1

Fügen Sie diese Zeile in Ihrer Seite im Skript-Tag hinzu.

$(function($) { 

    // this script needs to be loaded on every page where an ajax POST 
    $.ajaxSetup({ 
     data: { 
      '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>' 
     } 
    }); 


    // now write your ajax script 

}); 

Lassen Sie mich wissen, ob es funktioniert nicht

+0

Es ist immer noch das gleiche @Shyam Shingadiya :( –

1

Refresh CSRF-Token auf AjaxPOST Datentabellen: CodeIgniter

Die obige Aussage ist & selbsterklärend klare Bedeutung hat, dass:

Wir haben CSRF-Token zu aktualisieren, wenn wir machen AjaxPOST

Also, wie wir CSRF-Token in CodeIgniter Aktualisieren könnte & Was Refresh CSRF in CodeIgniter ist.


Wenn Ihr AJAX eine AjaxGET anstelle eines AjaxPOST verwendet, werden Sie das Problem nicht haben als CSRF auf POST-Daten funktioniert nur.


Alternativ müssen Sie Ihre neue CSRF-Token und Hash und senden Sie es in Ihrem AjaxPOST Anruf bekommen, dann die Token und Hash Einstellungen in Ihrem HTML oder JavaScript-Code aktualisieren.


Alternativ können Sie die betreffende URL frei von CSRF machen den $ config config-Element mit [ 'csrf_exclude_uris'] = array();


Alternativ können Sie lange Zeitdauer eingestellt CSRF abzulaufen Token die $ config config-Element mit [ 'csrf_expire'] = 300;. Hier ist 5 Minuten definiert, um das CSRF-Token abzulaufen. Vor dem Ablauf der Zeit (die mit dem ersten POST-Zeitstempel beginnt) können Sie das alte CSRF-Token verwenden, das von CodeIgniter generiert wurde, wenn Sie den ersten POST auslösen. Wenn nach dem ersten POST innerhalb von 5 Minuten kein POST-Trigger ausgelöst wird, läuft CodeIgniter das CSRF-Token ab und danach müssen Sie das neue CSRF-Token abrufen. Sounds .. Complex Kein Problem

Sie die Seite neu zu laden Angenommen & CodeIgniter neuen CSRF Hash gesetzt wird, können Sie das verwenden, um einen AjaxPOST Antrag zu stellen. Wenn Sie jedoch innerhalb von 5 Minuten keine Anforderung stellen oder die Seite neu laden, wird die alte CSRF-Datei ablaufen. Wenn Sie nun die AjaxPOST-Anfrage erneut aufrufen, erhalten Sie 500/403 als Antwort. Das bedeutet, CodeIgniter alt CSRF Hash verfallen, weil Sie Anfrage nach 5 Minuten mit alten CSRF Hash gemacht, das ist eigentlich nicht jetzt existiert .... Klar :)

Also, was können wir tun, um neue CSRF zu bekommen Token beim Erstellen von AjaxPOST ..?

  • Nun, für die GET-Anfrage erforderlich Nein CSRF-Token.
  • Aber für den POST ja! Sie müssen CSRF mit AjaxPOST senden, wenn Sie mit CodeIgniter CSRF Sicherheit verwenden $ config ['csrf_protection'] = TRUE;

Die Logik dahinter, so erhält neue CSRF-Hash, bevor Sie mithilfe von GET jede AjaxPOST machen. Stellen Sie es irgendwo in DOM oder anhängen in AjaxSetup.

: Ich bin in CodeIgniter .. :(Haben Sie zB haben ..?

(Bulma !! Warum Sie mein Auto wieder treffen ...) Ja sicher !!!:)

ist hier Ansicht Html-Code:

<!DOCTYPE html> 
<html lang="en"> 
<head> 

    <meta charset="utf-8"> 
    <meta name="<?=$this->security->get_csrf_token_name()?>" content="<?=$this->security->get_csrf_hash()?>"/> 

    <title>CodeIgniter CSRF Refresh Demo</title> 

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 

    <script type="text/javascript"> 

    // Set CodeIgniter base_url in JavaScript var to use within 
    var _BASE_URL_ = "<?=base_url()?>"; 
    var _CSRF_NAME_ = "<?=$this->security->get_csrf_token_name()?>"; 

    (function($) { 
     /** 
     * New jQuery function to set/refresh CSRF token in Body & to attach AjaxPOST 
     * @param {[type]} $ [description] 
     * @return {[type]} [description] 
     */ 
     $.fn.CsrfAjaxSet = function(CsrfObject) { 
      // getting meta object from body head section by csrf name 
      var CsrfMetaObj = $('meta[name="' + _CSRF_NAME_ + '"]'), 
      CsrfSecret = {}; 
      // if CsrfObject not set/pass in function 
      if (typeof CsrfObject == 'undefined') { 
       // assign meta object in CsrfObject 
       CsrfObject = CsrfMetaObj; 
       // get meta tag name & value 
       CsrfSecret[CsrfObject.attr('name')] = CsrfObject.attr('content'); 
      } 
      // CsrfObject pass in function 
      else { 
       // get Csrf Token Name from JSON 
       var CsrfName = Object.keys(CsrfObject); 
       // set csrf token name & hash value in object 
       CsrfSecret[CsrfName[0]] = CsrfObject[CsrfName[0]]; 
      } 
      // attach CSRF object for each AjaxPOST automatically 
      $.ajaxSetup({ 
       data: CsrfSecret 
      }); 
     }; 
     /** 
     * New jQuery function to get/refresh CSRF token from CodeIgniter 
     * @param {[type]} $ [description] 
     * @return {[type]} [description] 
     */ 
     $.fn.CsrfAjaxGet = function() { 
      return $.get(_BASE_URL_ + 'Csrfdata', function(CsrfJSON) { 
       $(document).CsrfAjaxSet(CsrfJSON); 
      }, 'JSON');    
     }; 
    })(jQuery); 

    // On DOM ready attach CSRF within AjaxPOST 
    $(document).CsrfAjaxSet(); 

</script> 
</head> 
<body> 
<button class="button">Click Me to Trigger AjaxPOST</button> 
    <script type="text/javascript"> 
     // on DOM ready 
     $(document).ready(function(){ 
      // my button 
      $btn = $('.button'); 
      // on button click 
      $btn.on('click', function(e){ 
       // stop default event 
       e.preventDefault(); 
       // trigger refresh csrf token 
       var CSRF = $(document).CsrfAjaxGet(); 
       // use callback to put your AjaxPOST & Done! 
       CSRF.success(function(){ 
        $.ajax({ 
         url: _BASE_URL_ + 'Controller/Method', 
         method: 'POST', 
         success: function(data){ 
          alert('Success'); 
         }, 
         error: function(xhr, status, error){ 
          alert(error); 
         } 
        }); 
       }); 
      }); 
     }); 
    </script> 
</body> 
</html> 

Hier Controller:

<?php 

(defined('BASEPATH') or exit('No direct script access allowed')); 

/** 
* Class Csrfdata to return fresh CSRF hash value 
*/ 
class Csrfdata extends CI_Controller 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    /** 
    * Return CodeIgniter CSRF name & Hash on request 
    * @return [type] [description] 
    */ 
    public function index() 
    { 
     if ($this->input->get()) { 
      $csrf = array(); 
      $csrf_name = $this->security->get_csrf_token_name(); 
      $csrf_hash = $this->security->get_csrf_hash(); 
      $csrf[$csrf_name] = $csrf_hash; 
      echo json_encode($csrf); 
     } 

    } 

} 

/* End of file Csrfdata.php */ 
/* Location: ./application/controllers/Csrfdata.php */ 

Hoffnung jeder wird diese Antwort genießen, jeden Vorschlag , Kommentare viel Wertschätzung ted ... wie immer ..: D

1

Danke Neeraj! Deine Lösung hat für mich funktioniert.

Ich habe den folgenden Code für AJAX DataTable in CodeIgniter verwendet. Dadurch wird die CSRF-Refresh-Methode beim Abrufen der Ergebnisse aus dem AJAX-Aufruf von DataTable ausgelöst.

$('#table').DataTable({ 
    "ajax": { 
     "url": "<?php echo site_url(); ?>list", 
     "type": "POST", 
     "dataSrc": function (json) { 
      $(document).CsrfAjaxGet(); 
      return json.data; 
     } 
    } 
});