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
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