Codeigniter 3 csrf_token在一页中起作用,但在另一页中不起作用

时间:2020-06-17 04:42:20

标签: php ajax codeigniter-3

我在具有控制器的同一codeigniter 3项目中有两个页面,每个页面都有一个子视图,但是使用相同的模板。

这两个页​​面具有相同的控制器和子视图(仅用于测试,因为在实际情况下,它们实际上具有相同的行为和代码)。
第1页:http://localhost/project-name/register-page1/form/
第2页:http://localhost/project-name/register-page2/form/

在第1页上,带有csrf_token()的ajax可以正常工作。但使用第2页中的相同代码,则无法使用,并说从ajax请求访问方法时禁止403。

我不知道为什么我的代码无法在page1上运行,但不能在page2上运行,并且错误403被禁止。请帮助我...

POST http://localhost/project-name/register-page2/getKabupatenByProvinceName 403(禁止访问)

config.php 设置上

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_platform';
$config['csrf_cookie_name'] = 'csrf_cookie_platform';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

register-page1 register-page2 ajax控制器

    public function getKabupatenByProvinceName()
    {
        $province_name = $this->input->post('name', TRUE);
        $province_data = $this->Province_model->getProvinceByName($province_name)->row();
        $data = $this->Province_model->getRegencyByProvinceId($province_data->id)->result();
        echo json_encode($data);
    }
视图上的

register-page1 register-page2 ajax请求

    $('#provinsi').change(function() {
            var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>';
            var csrfHash = get_token();
            $('#kabupaten_kota' + '_loading').html('<i class="fa fa-spinner fa-spin" style="font-size:16px"></i> Loading');
            var name = $(this).val();
            $.ajax({
                url: window.location.origin + "/umi-pnm/register/getKabupatenByProvinceName",
                method: "POST",
                data: {
                    name: name,
                    [csrfName]: csrfHash
                },
                async: true,
                dataType: 'json',
                success: function(data) {
                    refill_token();
                    var html = '';
                    var i;
                    html += '<option value="" disabled selected>-- Pilih Kabupaten --</option>';
                    for (i = 0; i < data.length; i++) {
                        html += '<option value="' + toTitleCase(data[i].name) + '">' + toTitleCase(data[i].name) + '</option>';
                    }
                    $('#kabupaten_kota').html(html);
                    $('#kabupaten_kota' + '_loading').html('');
                }
            });
            return false;
        });

register-page1 register-page2 ajax函数可获取并重新填充csrf_token

function get_token() {
            var respon;
            $.ajax({
                type: 'GET',
                async: false,
                url: window.location.origin + "/umi-pnm/register/regenerate_csrf_token",
                dataType: "html",
                success: function(data) {
                    respon = data;
                }
            });

            return respon;
        }
function refill_token() {
            var respon;
            $.ajax({
                type: 'GET',
                async: false,
                url: window.location.origin + "/umi-pnm/register/regenerate_csrf_token",
                dataType: "html",
                success: function(data) {
                    respon = data;
                }
            });
            var els = document.getElementsByName('<?php echo $this->security->get_csrf_token_name(); ?>');
            // console.log(els.length);
            for (var i = 0; i < els.length; i++) {
                els[i].value = respon;
            }
        }

0 个答案:

没有答案
相关问题