繁体   English   中英

CodeIgniter CSRF 403错误

[英]CodeIgniter CSRF 403 error

我试图解决这个问题已经很长时间了,但仍然没有任何线索。 我正在尝试在CodeIgniter框架内发送和捕获AJAX请求。 带有页面模板的PHP文件:

<table id="jivoClients" class="display nowrap" cellspacing="0" width="100%">
    <tbody>
    <?php foreach($clients as $client): ?>
            <td class="details-control" id="<?php echo $client["chat_id"]. ","
                        .$this->security->get_csrf_token_name(). ","
                        .$this->security->get_csrf_hash(); ?>"></td>
            <th class="clientData"><?php echo str_replace(",", "<br>" , $client["visitor_info"]); ?></th>
            <th class="clientData"><?php echo ($client['session_geoip_country']); ?></th>
            <th class="clientData"><?php echo ($client['session_geoip_city']); ?></th>
            <th class="clientData"><?php echo ($client['visitor_chats_count']); ?></th>
            <th class="clientData"><?php echo ($client['agents_names']); ?></th>
            <th class="clientData"><?php if(isset($client['messages']['0']['timestamp'])): ?>
                <?php echo date('m/d/Y', $client['messages']['0']['timestamp']); ?>
                <?php endif;?></th>
            <th class="clientData"><?php if(isset($client['messages']['0']['timestamp'])): ?>
                <?php echo date('H:i:s', $client['messages']['0']['timestamp']); ?>
                <?php endif;?></th>
            <th class="clientData"><?php if(isset($client['messages']['0']['Message'])): ?>
                <?php echo ($client['messages']['0']['Message']); ?>
                <?php endif;?></th>
            <th class="clientData"><?php echo ($client['Manager_note']); ?></th>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>

在我的js文件中,代码如下所示:

var id = $(this).attr('id');
    var messageData = id.split(",");
    var token = "" + messageData[1];
    var post_data = {
        'id' : messageData[0],
        'csrf_crm' : messageData[2]
    }
    $.ajax({
        type:'POST',
        data: {
            func : 'getNewLocations',
            'id' : messageData[0],
            'csrf_crm' : messageData[2]
        },
        url:'application/controllers/AjaxController.php',

        success: function(result, statut) {
            if (result == 'add') {
                //do something
            }
            else if (result == 'remove') {
                //do something
            }
        }
    });

而且我不断收到403错误。 正如我在论坛上已经读过的,这意味着我的CSRF令牌不正确。 但是,看来我正常(在调试器中检查)。 但是,这不能解决问题。 提前致谢。

您需要执行echo以分配php变量的值。 也将令牌包装在''

var token = '<?php echo $this->security->get_csrf_hash() ?>'; //<----- do echo here
    var id = $(this).attr('id');
    $.ajax({
                type:'POST',
                data: {
                    func : 'getNewLocations',
                    'id' : id,
                    'csrf_crm' : token
                },
                url:'application/controllers/AjaxController.php',

                success: function(result, statut) {
                    if (result == 'add') {
                        //do something
                    }
                    else if (result == 'remove') {
                        //do something
                    }
                }
            });

获取这样的csrf令牌值:

var token = $('[name="csrf_token"]').val();

最后我解决了这个问题。 它补充说,我在js文件中使用了错误的路由。 正确的操作顺序如下所示:1)在route.php文件中添加新行:

$route['jivosite/user'] = 'jivosite/user';

2)在js文件中添加代码:post_data = JSON.stringify(post_data);

    post_data = JSON.stringify(post_data);
    var url = baseurl + "jivosite/user"
    var xhr = new XMLHttpRequest();
    xhr.open("POST", url);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.addEventListener("readystatechange", function () {
        if (xhr.readyState == 4 && xhr.status === 200) {
            console.log(xhr.response);
        }
    });
    xhr.addEventListener("error", function (err) {
        console.log(err);
    });
    xhr.send(post_data ? JSON.stringify(post_data) : null);

3)检查config.php文件。 $config['cookie_secure'] = FALSE; 应该像这样, $config['csrf_exclude_uris'] = array('jivosite/user'); 应该包括我的路线

4)在controllers文件夹中创建文件Jivosite.php,内容如下:

class Jivosite extends CI_Controller
{
    public function user()
    {
        $id=$this->input->post('id');
        echo $id;
    }
}

它为我工作。 感谢所有答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM