CodeIgniter CSRF 403错误

时间:2017-07-27 11:55:01

标签: javascript php codeigniter

我正在尝试解决这个问题很长一段时间,并且对它没有任何线索。 我试图在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令牌不正确。但似乎我得到它正常(在调试器中检查)。 然而,这并没有解决问题。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

你需要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
                    }
                }
            });

答案 1 :(得分:0)

获取csrf标记值,如下所示:

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

答案 2 :(得分:0)

最后我解决了这个问题。 它出现了,我在js文件中使用了错误的路由。 正确的操作顺序如下所示: 1)在文件routes.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;
    }
}

它对我有用。 谢谢你的所有答案。