当前位置: 首页 > 知识库问答 >
问题:

禁止Codeigniter Ajax

云令
2023-03-14

我对这个被禁止的问题感到困惑。首先,我查看了相关的stackoverflow帖子,并在谷歌上搜索了足够多,但仍然不知道。

项目详细信息:

- Currently used libraries:
    1. Carabiner (https://github.com/bcit-ci/CodeIgniter/wiki)
    2. Template (https://github.com/jenssegers/codeigniter-template-library)
    3. hmvc
    3. instagram_api 

- CSRF Protection turned on (I don't want false the protection)

- Followed main posts
    1. https://stackoverflow.com/questions/40225908/ajax-post-not-working-codeigniter
    2. https://stackoverflow.com/questions/22527412/403-forbidden-access-to-codeigniter-controller-from-ajax-request

- ISSUE: 403 Forbidden ("The action you have requested is not allowed.")

HTML

Instagram.php

form_open()函数为访问令牌生成隐藏字段,并将其包含在ajax发布数据中。

<input type="hidden" name="csrf_token_localhost" value="3f5887fd41ac4eaa9b558afa7cb4a6de">
...
<?php echo form_open('admin/getInstagramAccessToken', array('id' => 'instagram_settings', 'class' => 'form-horizontal row-border')); ?>
...
    <div class="col-sm-8 col-sm-offset-2">
        <?php  echo form_submit('submit', 'Get my access token', ['class' => 'btn-primary btn btn-get-token']); ?>
    </div>
...
<?php echo form_close(); ?>

JavaScript

AdminScript.js

$('#instagram_settings').submit(function( event ) {
    var posting_data = $( this ).serializeArray();
    event.preventDefault();
    
    $.ajax({
        type: 'POST',
        dataType: 'json',
        async: true,
        cache: false,
        data: posting_data,
        url: 'admin/getInstagramAccessToken',
        success: function(json) {

            try{
                console.log(json);
            }catch(e) {
                console.log('Exception while request..');
            }

        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(jqXHR, textStatus, errorThrown);
        },
        complete: function() {
            console.log('ajax complete');
        }
    })

控制器

admin.php

public function getInstagramAccessToken() 
{
    if ($this->input->is_ajax_request()) 
    {
        $response['status'] = 'success';
        echo json_encode($response);
    }
    else
    {
        // if the request if not ajax then show 404 error page
        show_404();
    }
    
}

当我使csrf保护状态为假时,它们都能正常工作。或者当我将post类型从“post”改为“get”时。但我想保持状态为真,并使用“post”方法。

两个图像的Dropbox链接:

>

  • 表单加载后隐藏csrf令牌字段

    过帐html" target="_blank">数据

    https://www.dropbox.com/sh/e93ubgwzv9zir5j/aaa6vf5iwc1m7rtpgwgcpub4a?dl=0

  • 共有2个答案

    赏高格
    2023-03-14

    请在每一个有POST类型的表单中添加此片段。

                 <?php  $csrf = array(
                'name' => $this->security->get_csrf_token_name(),
                'hash' => $this->security->get_csrf_hash()
                 ); ?>   
                  <input type="hidden" name="<?php echo $csrf['name']; ?>" 
                  value="<?php echo$csrf['hash']; ?>" />
    
    梁新觉
    2023-03-14

    您可以通过发送带有AJAX请求的CSRF令牌来传递这个问题。这是因为您已将CSRF保护置于“开”模式。只有通过GET发送请求或显式地将CSRF'OFF'关闭时,才能绕过这一点,当然,这是不建议的。

    因此,解决方案是在AJAX请求中包含CSRF令牌。

    阅读这篇文章,了解更多关于在AJAX请求上添加CSRF令牌的信息。

    编辑:理想情况下,您应该通过ajax请求中的数据选项发送CSRF令牌。查看此链接以获取更多信息

     类似资料:
    • 一、功能说明 本功能为设置禁止登陆后台的IP地址,支持通配符 二、子功能导航 1.添加IP 2.管理IP 三、功能详解 1.添加IP 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择IP禁止 2).界面解释 进入后选择添加IP禁止按钮弹出如下界面 界面详述 1). IP: 填写您欲禁止进入后台的IP,支持通配符,如图所示将会阻止:127.0.0.0~127.0.0.255 之间的IP登陆

    • 请求header POST /v1/activity/{频道id}/comments/{观众id}/mute Authorization:Bearer {ACCESS TOKEN} Content-Type:application/json 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将"{频道id}"替换为您的频道id 请将"{观众id}"替换为您想要禁言

    • 问题内容: 在抓取https://www.netflix.com之类的网站时,被robots.txt禁止:https://www.netflix.com/> 错误:未下载以下响应:https : //www.netflix.com/ 问题答案: 在2016年5月11日发布的新版本(scrapy 1.1)中,抓取功能先在抓取之前下载了robots.txt。要更改此行为,请使用ROBOTSTXT_OB

    • 你好,我对上面的代码有一个问题。我从一个网站上得到的。它返回$缓冲区,服务器理解请求,但被禁止。

    • Spring我是新来的。我试图在我的数据库中添加一个新目标。在我添加spring security之前,它是有效的,但现在如果我单击添加新目标,我有一个问题: 出现意外错误(类型=禁止,状态=403)。被禁止的 我的goat-add.html: WebSecurity配置类: 我的控制器: 我读到这个问题可以是如果不使用csrf,但我不明白我怎么能解决它。 所有代码:https://github.

    • 问题内容: 是否可以禁用滚轮在输入数字字段中更改数字?我已经弄乱了特定于Webkit的CSS,以删除微调框,但我想完全摆脱这种行为。我喜欢使用它,因为它在iOS上带来了一个不错的键盘。 问题答案: 防止其他对象建议的输入数字元素上的mousewheel事件的默认行为(调用“ blur()”通常不是首选方法,因为这不是用户想要的)。 但。我会避免一直监听所有input-number元素上的mouse