2016-04-03 47 views
2

所以我希望能夠在我的笨應用CSRF保護,但這意味着我的js不再當它在一個外部文件在外部JS獲取CSRF令牌文件

function saveToDatabase(editableObj,field,id) 
{ 

var pathArray = window.location.pathname.split('/'); 
var segment_3 = pathArray[3]; 
var save_data = { 
        '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', 
        'field':field, 
        'editedValue':editableObj.innerHTML, 
        'id':id 

       }; 

$.ajax({ 
    url: segment_3+'/update', 
    type: 'POST', 
    data:save_data, 
    success: function(){ 
     $(editableObj).addClass('bg-success'); 
    }   
}); 
} 

我測試通過複製粘貼到工作該視圖文件,它工作得很好。 所以問題是,這條線

'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', 

在外部文件無法正常工作?有什麼方法可以使這個工作?

回答

3

您可以將此值存儲到隱藏的輸入或任何隱藏的元素,那麼您可以在外部js文件訪問它..

<input type ='hidden' name='what_you_want' id='whatever_you_like' value='<?php echo $this->security->get_csrf_token_name(); ?>'> 
<input type ='hidden' name='what_you_want1' id='whatever_you_like1' value='<?php echo $this->security->get_csrf_hash(); ?>'> 

,你可以得到它在JS這樣

var tmp = $('#whatever_you_like').val(); 
var tmp1 = $('#whatever_you_like1').val(); 

var save_data = { 
        tmp: tmp1, 
        'field':field, 
        'editedValue':editableObj.innerHTML, 
        'id':id 

       }; 
+0

你確定這是不危險的,如果說惡意用戶在這個頁面上? 編輯: - 剛剛發現CI的人不會在窗體上自動執行此操作。 – Killzerman

+0

不,因爲我只是得到外部JavaScript的PHP值沒有別的..因爲惡意用戶到外部JavaScript也是正確的? –

+1

我只是好奇,如果有HTML中顯示的csrf標記名稱和哈希是危險的或不。 – Killzerman

0

定義JS恆定在頭文件等

var CSRF_NAME = '<?php echo $this->security->get_csrf_token_name(); ?>'

var CSRF_TOKEN = '<?php echo $this->security->get_csrf_hash(); ?>'

然後只需撥打CSRF_NAMECSRF_TOKEN任何地方在外部或內聯JS。