在外部js文件中获取CSRF令牌

时间:2016-04-03 17:14:48

标签: javascript php ajax codeigniter csrf

所以我想在我的codeigniter应用程序中启用CSRF保护,但这意味着我的js在外部文件中不再有效

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(); ?>',

不能在外部文件中工作?有没有办法让它工作?

2 个答案:

答案 0 :(得分: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

                };

答案 1 :(得分:0)

在头文件中定义JS常量,如

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

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

然后只需在外部或内联JS中调用CSRF_NAMECSRF_TOKEN