php - 403 禁止从 ajax 请求访问 CodeIgniter Controller

标签 php jquery ajax codeigniter

我在向 codeigniter Controller 发送 ajax 请求时遇到问题。它返回 404 禁止访问错误。我发现了一些与此类似的问题,但我不确定它是否特定于 CodeIgniter 框架,而且该线程中给出的解决方案也没有解决我的问题。下面是我的ajax请求。我想知道这可能是因为 CI 应用程序文件夹的根文件夹的 .htaccess,但我还不想更改其默认配置。

向 CI Controller 发送 ajax 请求是实现此目的的正确方法吗?如果没有,请提出任何建议。谢谢!

var ajax_load = '{loading gif img html}';
var ajax_processor = 'http://localhost/patientcare-v1/application/controller/ajax_processor/save_physical_info';

$("#save").click(function(){
    $("#dialog-form").html(ajax_load);
    $.post(
        ajax_processor,
        $("#physical-info").serialize(),
        function(responseText){
            $("#dialog-form").html(responseText);
        },
        "json"
    );
});

最佳答案

CodeIgniter使用csrf_protection,您可以简单地将它与Ajax和JQuery一起使用。 这个(最终?)解决方案适用于多个 Ajax 请求(没有 403 ;-) 并保持安全性)。

更改配置

打开文件/application/config/config.php 并将 $config['csrf_token_name'] 行更改为:

$config['csrf_token_name'] = 'token';

您可以使用其他名称,但在以后的步骤中随处更改它。

在 JavaScript 中添加 CSRF

在 View 中添加脚本;对我来说是在 footer.php 中在所有 View 中显示代码。

<script type="text/javascript">
    var CFG = {
        url: '<?php echo $this->config->item('base_url');?>',
        token: '<?php echo $this->security->get_csrf_hash();?>'
    };
</script>

该脚本创建一个名为CFG的对象。该对象可以在您的 Javascript 代码中使用。 CFG.url 包含您网站的 url 和 CFG.token ... token 。

自动续订 CSRF

将此代码添加到您的部分中$(document).ready(function($){---})

$(document).ready(function($){
    $.ajaxSetup({data: {token: CFG.token}});
    $(document).ajaxSuccess(function(e,x) {
        var result = $.parseJSON(x.responseText);
        $('input:hidden[name="token"]').val(result.token);
        $.ajaxSetup({data: {token: result.token}});
    });
});

此脚本初始化 CSRF token ,并在每次发送 Ajax 请求时更新它。

用 PHP 发送 CSRF

我创建了一个新 Controller ,名为 Ajax。在CodeIgniter中,使用它的链接是http://www.domain.ltd/ ajax/foo

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Ajax extends CI_Controller {

    public function foo() {
        $this->send(array('foo' => 'bar'));
    }

    private function send($array) {

        if (!is_array($array)) return false;

        $send = array('token' => $this->security->get_csrf_hash()) + $array;

        if (!headers_sent()) {
            header('Cache-Control: no-cache, must-revalidate');
            header('Expires: ' . date('r'));
            header('Content-type: application/json');
        }

        exit(json_encode($send, JSON_FORCE_OBJECT));

    }

}

send函数自动添加CSRF并转换对象中的数组。

最终结果

现在,您可以非常简单地将 Ajax 与 JQuery 结合使用!

$.post(CFG.url + 'ajax/foo/', function(data) {
    console.log(data)
}, 'json');

结果:

{"token":"8f65cf8e54ae8b71f4dc1f996ed4dc59","foo":"bar"}

当请求获取数据时,CSRF会自动更新到下一个Ajax请求。

瞧瞧!

关于php - 403 禁止从 ajax 请求访问 CodeIgniter Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22527412/

相关文章:

php - 多个内部连接在 PHP 中不起作用

javascript - JQuery动画: Is it possible to change speed during the animation?

php - 我必须设计一个包含 1000 个表单的 Web 应用程序

php - 将使用路径更新列的触发器

PHP max_execution_time 显示错误值

javascript - WordPress通过AJAX从页面获取内容

javascript - 在提交之前验证表单

javascript - 如何使用ajax在CKEDITOR中动态加载模板?

javascript - ajax 调用 PHP 数据返回 VM92 :1 Uncaught SyntaxError: Unexpected token {

javascript - 在循环 JavaScript/JQuery 中运行函数